观察者
状态变化时通知订阅方。
行为型
说明
发布者维护订阅者列表;需要考虑退订和慢订阅者对同步通知的影响。
分析
订阅方注册回调后,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")
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任