设计模式之观察者模式(发布订阅模式)
小王以前上班看美女,被老板抓到几次后,现在有了阴影,好久没敢看了。谁知今天又在看美女,被身边的同事看到了。小王啊今天怎么又敢看美女了,不怕老板了,小王嘿嘿一笑,低声说我有“眼线”。其实小王收买了门口的小美,让小美在领导进屋的时候通知自己。大家一听都很感兴趣,纷纷去找小美了,小美一看人多了,不好通知,索性就建了个群,把需要通知的都拉入群中,在老板进屋的时候,小美会在群中吆喝一声,大家收到赶快回复干活状态。这其实就是观察者模式。
观察者模式(Observer Pattern):定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者模式也叫发布订阅模式。观察者模式的通用类图如下:
观察者模式的通用类图
说明下几个角色名称:
1、Subject被观察者,能够动态的添加和删除观察者并管理和通知观察者。
2、Observer观察者,接收到被观察者的信息进行更新。
3、ConcreteSubject具体的被观察者,实现逻辑并且通知事件到观察者。
4、ConreteObserver具体的观察者
先来定义一个被观察者接口,定义一个添加、删除和通知的方法。
被观察者接口
定一个被观察接口,并定义一个更新的方法。
观察者接口
具体的被观察者,实现被观察接口,并定义一个存放观察者的集合,实现添加和删除。
具体被观察者
具体的观察者,实现更新方法。
具体的观察者
一个场景测试类,测试结果如下:
场景测试类
观察者模式的优缺点:
1、优点,观察者和被观察者是抽闲耦合,容易扩展,并且建立了一套触发机制。
2、缺点,一个被观察者多个观察者,如果一个观察者执行缓慢,会影响后面的通知。(异步多线程通知能解决这个问题)
JDK中已经帮我们提供了观察者接口和被观察者的实现,对应的类为java.util.Observable和java.util.Observer。用JDK中的观察者和被观察简单实现,必须设置被观察者中的changed为ture,等有通知的时候才会通知观察者,代码和打印结果如下:
JDK中的观察者和被观察者实现
领取专属 10元无门槛券
私享最新 技术干货