Skip to content
← 返回设计模式列表
设计意图与对象责任

观察者 ​

状态变化时通知订阅方。

行为型

说明 ​

发布者维护订阅者列表;需要考虑退订和慢订阅者对同步通知的影响。

分析 ​

订阅方注册回调后,Publish 会按注册顺序通知它们。发布者只知道回调列表,不需要依赖具体消费者类型。

注册保存的是函数引用,Publish 同步遍历调用,不会创建独立任务。第一个回调耗时一秒,后续回调至少等待一秒;若回调再次订阅或发布,需另定义重入语义。异步化后应明确队列容量、退出与消息丢弃规则,不能继续默认为同步版本的完成和顺序保证。

查看图表代码

适用前提与边界 ​

这个同步版本会被慢回调阻塞;生产场景还要考虑退订、异常隔离和并发安全。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
bus := new(EventBus)
	bus.Subscribe(func(s string) { fmt.Println("received:", s) })
	bus.Publish("updated")

运行输出 ​

text
received: updated

完整 Go 示例 ​

go
package main

import "fmt"

type EventBus struct{ listeners []func(string) }

func (b *EventBus) Subscribe(fn func(string)) {
	b.listeners = append(b.listeners, fn)
}
func (b *EventBus) Publish(s string) {
	for _, fn := range b.listeners {
		fn(s)
	}
}

func main() {
	bus := new(EventBus)
	bus.Subscribe(func(s string) { fmt.Println("received:", s) })
	bus.Publish("updated")
}

继续阅读