观察者模式

在开发中,经常会遇到这样的场景:一个对象的状态发生变化时,需要通知其他多个对象做出相应的反应。

比如你在一个拍卖会上,拍卖师每次喊出新的价格,所有竞拍者都需要知道最新报价,然后决定是否继续加价。

如果让每个竞拍者不停地去问拍卖师「现在多少钱了?」,那场面就太混乱了。正常的做法是:竞拍者举牌表示参与,拍卖师每次报价时主动通知所有举牌的人。

观察者模式(Observer Pattern) 就是这个思路:定义一种订阅机制,当一个对象的状态发生变化时,所有订阅了它的对象都会自动收到通知。

这是我们介绍的第一个行为型设计模式。前面讲的创建型模式(单例工厂方法抽象工厂 等)关注「怎么创建对象」,结构型模式(适配器装饰组合 等)关注「怎么组合对象」,而行为型模式关注的是「对象之间怎么通信」。

观察者模式的核心角色:

  • 发布者(Subject/Publisher):维护一个观察者列表,提供注册(attach)、注销(detach)和通知(notify)方法。
  • 观察者接口(Observer):定义一个 update 方法,所有观察者都要实现它。
  • 具体发布者(Concrete Subject):持有具体的状态,状态变化时调用 notify 通知所有观察者。
  • 具体观察者(Concrete Observer):实现 update 方法,定义收到通知后的具体行为。

看两个例子就能直观地理解了。