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中文网其他相关文章!