Go 語言中的觀察者模式
在許多程式場景中,都需要一個物件在事件發生時通知多個訂閱者。這種模式通常稱為觀察者模式。在 Go 中,通道為實現此模式提供了一個優雅的解決方案。
下面的程式碼範例示範了一個工作範例:
<code class="go">type Publisher struct { listeners []chan *Msg } type Subscriber struct { Channel chan *Msg } func (p *Publisher) Sub(c chan *Msg) { p.appendListener(c) } func (p *Publisher) Pub(m *Msg) { for _, c := range p.listeners { c <- Msg } } func (s *Subscriber) ListenOnChannel() { for { data := <-s.Channel // Process data } } func main() { publisher := &Publisher{} subscribers := []*Subscriber{ &Subscriber{make(chan *Msg)}, &Subscriber{make(chan *Msg)}, // Additional subscribers can be added here } for _, sub := range subscribers { publisher.Sub(sub.Channel) go sub.ListenOnChannel() } publisher.Pub(&Msg{"Event Notification"}) // Pause the main function to allow subscribers to process messages time.Sleep(time.Second) } type Msg struct { Message string }</code>
在此範例中,發布者持有一段偵聽器通道,代表訂閱的物件。 Pub 方法透過將資料傳送到所有偵聽器的通道來通知它們。每個訂閱者在其專用通道上連續監聽傳入的資料以進行處理。
以上是如何使用Go通道來實現觀察者模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!