golang实现监听者模式

监听者模式定义了一对多的依赖关系,当对象状态改变时会通知所有依赖对象。在Golang中,通过接口实现被监听者和监听者的交互,常见于事件处理和GUI系统。示例代码展示了如何创建并移除监听者,以及发送通知的过程。
摘要由CSDN通过智能技术生成

1. 什么是监听者模式

监听者模式的作用是在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在代码中,被监听者接口定义了添加、删除和通知监听者的方法,而监听者接口定义了更新方法。

2. 监听者模式使用的场景

  1. 当一个对象的改变需要同时改变其他对象的时候,或者当一个对象的改变需要通知其他对象,而又不希望和被通知的对象形成紧耦合关系的时候。
  2. 当一个对象需要将自己的改变通知其他对象,而它又不需要知道其他对象的细节的时候。
  3. 当一个对象需要通知其他对象,而这些对象又不需要知道通知的来源对象的时候。
    在实际开发中,监听者模式常用于事件处理、GUI 系统、网络编程等场景。

3. golang实现监听者

  • 模拟场景
  1. 实现两个监听对象,当服务发生通知时,两个监听者收到通知信息;
  2. 移除一个监听者2,再次发生通知。只有监听者1接受到信息。
package main  
  
import "fmt"  
  
// 定义一个监听者接口  
type Observer interface {  
   Update(string)  
}  
  
// 定义一个被监听者接口  
type Subject interface {  
   AddObserver(Observer)  
   RemoveObserver(Observer)  
   Notify(string)  
}  
  
// 实现被监听者接口  
type ConcreteSubject struct {  
   observers []Observer  
}  
  
func (cs *ConcreteSubject) AddObserver(observer Observer) {  
   cs.observers = append(cs.observers, observer)  
}  
  
func (cs *ConcreteSubject) RemoveObserver(observer Observer) {  
   for i, o := range cs.observers {  
      if o == observer {  
         cs.observers = append(cs.observers[:i], cs.observers[i+1:]...)  
         break  
      }  
   }  
}  
  
func (cs *ConcreteSubject) Notify(msg string) {  
   for _, o := range cs.observers {  
      o.Update(msg)  
   }  
}  
  
// 实现监听者接口  
type ConcreteObserver struct {  
   name string  
}  
  
func (co *ConcreteObserver) Update(msg string) {  
   fmt.Printf("%s receive message: %s\n", co.name, msg)  
}  
  
func main() {  
   subject := &ConcreteSubject{}  
   observer1 := &ConcreteObserver{name: "observer1"}  
   observer2 := &ConcreteObserver{name: "observer2"}  
   subject.AddObserver(observer1)  
   subject.AddObserver(observer2)  
   subject.Notify("hello")  
   subject.RemoveObserver(observer2)  
   subject.Notify("world")  
}
  • 输出结果
observer1 receive message: hello
observer2 receive message: hello
observer1 receive message: world
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值