监听者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “监听” 该对象的其他对象。

使用背景

  1. 对象间的一对多依赖关系:当一个对象的状态发生变化时,需要通知多个其他对象进行相应的更新。观察者模式可以建立一种一对多的依赖关系,使得一个被观察者对象的状态变化能够自动通知到多个观察者对象。

  2. 解耦观察者和被观察者:观察者模式可以将观察者和被观察者之间的耦合度降低到最低程度,使得它们之间的交互更加灵活。被观察者对象只需维护一个观察者列表,而不需要关心具体的观察者是谁以及观察者做了什么。

  3. 分布式事件处理系统:在分布式系统中,可能存在多个组件需要共享某些事件或消息。观察者模式可以很容易地实现这种分布式事件处理系统,每个组件可以注册为观察者,而事件源可以作为被观察者。

  4. 事件驱动编程:观察者模式是事件驱动编程的一种重要实现方式。事件源对象可以发出事件,而观察者对象可以订阅这些事件并做出相应的处理。这种模式在图形界面开发、消息队列系统等方面都有广泛应用

实现代码

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 main

import "fmt"

// Listener 定义监听器接口
type Listener interface {
OnEvent(event string)
}

// EventSource 定义事件源接口
type EventSource interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
NotifyListeners(event string)
}

// EventManager 事件管理器
type EventManager struct {
listeners []Listener
}

// AddListener 添加监听器
func (em *EventManager) AddListener(listener Listener) {
em.listeners = append(em.listeners, listener)
}

// RemoveListener 移除监听器
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
}
}
}

// NotifyListeners 通知所有监听器
func (em *EventManager) NotifyListeners(event string) {
for _, listener := range em.listeners {
listener.OnEvent(event)
}
}

// EventListener 实现了监听器接口
type EventListener struct {
name string
}

// OnEvent 事件发生时的处理方法
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")
}

结语

监听者模式适用于那些需要建立一种一对多的依赖关系,当一个对象的状态发生变化时,需要通知多个其他对象进行相应处理的场景。通过监听者模式,我们可以实现对象之间的解耦,使得被观察者对象无需关心具体的观察者是谁以及观察者做了什么,只需要通知所有的观察者即可。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。