在开发中,经常会遇到这样的场景:一个对象的状态发生变化时,需要通知其他多个对象做出相应的反应。
比如你在一个拍卖会上,拍卖师每次喊出新的价格,所有竞拍者都需要知道最新报价,然后决定是否继续加价。
如果让每个竞拍者不停地去问拍卖师「现在多少钱了?」,那场面就太混乱了。正常的做法是:竞拍者举牌表示参与,拍卖师每次报价时主动通知所有举牌的人。
观察者模式(Observer Pattern) 就是这个思路:定义一种订阅机制,当一个对象的状态发生变化时,所有订阅了它的对象都会自动收到通知。
这是我们介绍的第一个行为型设计模式。前面讲的创建型模式(单例、工厂方法、抽象工厂 等)关注「怎么创建对象」,结构型模式(适配器、装饰、组合 等)关注「怎么组合对象」,而行为型模式关注的是「对象之间怎么通信」。
观察者模式的核心角色:
- 发布者(Subject/Publisher):维护一个观察者列表,提供注册(attach)、注销(detach)和通知(notify)方法。
- 观察者接口(Observer):定义一个
update方法,所有观察者都要实现它。 - 具体发布者(Concrete Subject):持有具体的状态,状态变化时调用
notify通知所有观察者。 - 具体观察者(Concrete Observer):实现
update方法,定义收到通知后的具体行为。
看两个例子就能直观地理解了。