概念
观察者模式定义了对象之间的一对多的依赖关系,当一个对象(被观察者)改变状态时,它的所有依赖者(观察者)都会收到通知并更新
设计原则
为了交互对象之间的松耦合设计而努力
理解
在这个模式中存在两个角色,一个是 “被观察者”,另一个是 “观察者”,他们之间的关系类似现实生活中的“报刊订阅”,其中被观察者是“报社”,观察者是“用户”,用户在报社购买报刊订阅服务后,报社一旦有新报刊发布,就会通知用户,而如果用户取消订阅,以后报社就不会通知该用户。从报社通知用户到用户得到报刊有两种过程,一种是报社将报刊送到用户家里(push),另一种是用户自己到报社取(pull),其中第一种过程是不管用户是否需要这份报刊,报社都会将最新的报刊送到用户家里,而第二种是用户根据自己的需要,到报社取需要的报刊,这是两种过程的区别。
组成
- 抽象主题(Subject):也就是抽象被观察者接口,提供增加删除和通知观察者的方法
- 抽象观察者(Observer):观察者接口,提供更新的方法
- 具体主题(ConcreteSubject):实现抽象主题接口,因此具有增加删除通知观察者的方法,
- 具体观察者(COncreteObserver):实现抽象观察者接口,注册具体主题后就可以接收到通知更新
下面是观察者模式的类图
实例
以下代码模拟一个报刊订阅的过程,有一家叫做 DailyNews 的报社,Tom 和 Jerry 都注册了这家报社的最新消息订阅服务,每当有最新消息到来,报社就会通知他们,接着 Tom 取消了这个服务,则报社的最新消息不会通知 Tom 而只通知 Jerry。在这个过程中,DailyNews 报社扮演被观察者角色,Tom 和 Jerry 两个用户扮演观察者角色
定义抽象用户接口类:User
定义了具体用户与具体报社之前的通信接口,通过这个接口,报社可以将通知更新给所有已注册用户