2023-09-03|閱讀時間 ‧ 約 4 分鐘

Golang - Design Pattern #25: 黑板模式 (Blackboard)

raw-image
📚 組合知識,解決複雜問題 ✨

在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。


🖥️ 黑板模式

黑板模式基於三個主要組件:

  1. 黑板(Blackboard): 這是一個中央存儲區,子系統可以從中讀取資訊並寫入結果。
  2. 知識源(Knowledge Sources):這些是專業的子系統,專門處理特定的問題或任務。
  3. 控制組件(Control Component):負責決定知識源的執行順序。

優點:

  • 靈活性:易於新增或移除知識源,無需修改其他部分。
  • 解耦:知識源之間是獨立的,允許並行和分布式處理。
  • 逐步求解:可以逐步解決問題,並根據每一步的結果動態調整。


Go to code


🌐 網路流量分析

想像一下一個安全系統,它需要分析網路流量以檢測潛在的威脅。


type Blackboard struct {
data []string
}

func (b *Blackboard) AddData(d string) {
b.data = append(b.data, d)
}

type KnowledgeSource interface {
Analyze(b *Blackboard)
}

type TrafficAnalyzer struct{}

func (t *TrafficAnalyzer) Analyze(b *Blackboard) {
// Analyze traffic patterns...
}

type ThreatDetector struct{}

func (t *ThreatDetector) Analyze(b *Blackboard) {
// Detect potential threats...
}

type ControlComponent struct{}

func (c *ControlComponent) Execute(b *Blackboard, ks KnowledgeSource) {
ks.Analyze(b)
}


🎶 語音識別系統

在語音識別系統中,聲音的多個層面如音高、節奏和強度都可能需要分析。


type SoundAnalysis struct {
data []float64
}

type PitchAnalyzer struct{}

func (p *PitchAnalyzer) Analyze(s *SoundAnalysis) {
// Analyze pitch...
}

type RhythmAnalyzer struct{}

func (r *RhythmAnalyzer) Analyze(s *SoundAnalysis) {
// Analyze rhythm...
}

type IntensityAnalyzer struct{}

func (i *IntensityAnalyzer) Analyze(s *SoundAnalysis) {
// Analyze intensity...
}

type ControlComponent struct{}

func (c *ControlComponent) Execute(s *SoundAnalysis, ks KnowledgeSource) {
ks.Analyze(s)
}


結論 🌟

黑板模式提供了一個強大的方式來組合多個子系統的專業知識,從而解決複雜的問題。此模式在需要多個子系統共同努力來完成一項任務的情況下特別有用,例如人工智能或大規模資料處理。



感謝

謝謝大家看完這篇,如果您喜歡我的文章,歡迎 小額贊助我 ^^


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.