
设计模式之观察者模式
设计模式之观察者模式
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
源代码地址:https://github.com/UniqueDong/zero-design-stu
主要角色
◆ 主题接口 Subject:管理所有的观察者以及数据变化后通知观察者。
◆ 观察者接口 Observer:接受自己订阅的主题发布的数据。
◆ 主题实现类。
◆ 观察者实现类。
使用场景
◆ 报社的业务就是出版报纸,客户订阅该报社,那么只要有新的报纸出版就会给订阅报社的客户送来,只要一直是报社的订阅客户,就能一直收到新报纸。
◆ 当你不想订阅,取消就可以,就不会再收到通知。
◆ 报社提供订阅与取消订阅的入口。
实际上这里就是一个观察者模式的例子,报社充当 Subject 主题角色,订阅报社的客户就是 Observer 观察者角色。出版者-主题,订阅者-观察者。
代码实现
实现一
首先我们定义 Subject 主题角色报社 NewspaperSubject。主要提供 注册观察者、删除观察者、通知所有观察者方法。
定义包报纸对象 Newspaper
定义主题对象
同时实现该主题,代码如下:
然后定义观察者(Observer)角色 也就是报纸订阅者
定义观察者具体实现类:一个香港用户订阅报纸
最后测试
方式二:通过JDK内置的实现
我们的JDK内部与为我们实现了观察者模式。只不过我们的主题需要继承 jdk 中的主题,观察者实现对应的Observer 接口。之前我们说过要多用组合与委托。面向接口编程而不是实现。内置的主题我们必须继承,若想更灵活其实我们自己定义主题接口会更好,并且也并不难。
首先我们的主题要先继承 Observerble ,这是jdk内置的。
接着定义我们的观察者:分别是偶数与奇数订阅者。
编写测试
总结
◆ java.util.Observable 的阴暗面:它是一个类,我们的主题必须继承它,我们若是想继承其他类就无能为力了。毕竟 Java 不能多重继承。
◆ 在哪里有观察者模式的运用?嘿嘿谷歌的 Guava 类库中的 EventBus 事件总线使用的就是观察者模式。
◆ Spring 中的 事件传播 也是如此。
◆ 主要作用就是为交互对象之间的松耦合。当一个对象改变,依赖它的对象都会收到通知。主题并不知道观察者的细节,只知道观察者实现了 Observer 接口。
文章转载自公众号:码哥字节
