监听者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “监听” 该对象的其他对象。
使用背景
对象间的一对多依赖关系 :当一个对象的状态发生变化时,需要通知多个其他对象进行相应的更新。观察者模式可以建立一种一对多的依赖关系,使得一个被观察者对象的状态变化能够自动通知到多个观察者对象。
解耦观察者和被观察者 :观察者模式可以将观察者和被观察者之间的耦合度降低到最低程度,使得它们之间的交互更加灵活。被观察者对象只需维护一个观察者列表,而不需要关心具体的观察者是谁以及观察者做了什么。
分布式事件处理系统 :在分布式系统中,可能存在多个组件需要共享某些事件或消息。观察者模式可以很容易地实现这种分布式事件处理系统,每个组件可以注册为观察者,而事件源可以作为被观察者。
事件驱动编程 :观察者模式是事件驱动编程的一种重要实现方式。事件源对象可以发出事件,而观察者对象可以订阅这些事件并做出相应的处理。这种模式在图形界面开发、消息队列系统等方面都有广泛应用
实现代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 package mainimport "fmt" type Listener interface { OnEvent(event string ) } type EventSource interface { AddListener(listener Listener) RemoveListener(listener Listener) NotifyListeners(event string ) } type EventManager struct { listeners []Listener } func (em *EventManager) AddListener(listener Listener) { em.listeners = append (em.listeners, listener) } func (em *EventManager) RemoveListener(listener Listener) { for i, l := range em.listeners { if l == listener { em.listeners = append (em.listeners[:i], em.listeners[i+1 :]...) break } } } func (em *EventManager) NotifyListeners(event string ) { for _, listener := range em.listeners { listener.OnEvent(event) } } type EventListener struct { name string } func (el *EventListener) OnEvent(event string ) { fmt.Printf("[%s] 收到事件:%s\n" , el.name, event) } func main () { eventManager := &EventManager{} listener1 := &EventListener{name: "监听器1" } listener2 := &EventListener{name: "监听器2" } eventManager.AddListener(listener1) eventManager.AddListener(listener2) eventManager.NotifyListeners("事件A" ) eventManager.RemoveListener(listener2) eventManager.NotifyListeners("事件B" ) }
结语 监听者模式适用于那些需要建立一种一对多的依赖关系,当一个对象的状态发生变化时,需要通知多个其他对象进行相应处理的场景。通过监听者模式,我们可以实现对象之间的解耦,使得被观察者对象无需关心具体的观察者是谁以及观察者做了什么,只需要通知所有的观察者即可。