一、Java.util包中实现观察者的类和接口
- java.util.Observable抽象类,实现了大部分目标类需要的功能。
- java.util/Observer接口,定义了update()方法,是观察者的接口
二、 Java实现与自己实现观察者模式的好处
- 不需要再定义观察者和目标的接口了,JDK中已经定义了;
- 具体的目标实现里面不需要再维护观察者的注册信息了,这个在Java中的Observable类里面已经帮忙实现好了;
- 触发通知的方式有一点变化,要先调用setChanged方法,这个是Java为了帮助实现更精确的触发控制而提供的功能;
- 具体观察者的实现里面,update方法其实能同时支持推模型和拉模型,这个是Java在定义的时候,就已经考虑进去了。
三、 具体实例
被观察目标类继承java.util.Observable
使用java的Observer模式时,在通知之前一定要调用
this.setChanged()
方法。然后主动调用通知方法
推模式方法:this.notifyObservers(Object obj);
将被观察目标的被观察的属性传递给观察者。
拉模式方法:this.notifyObservers();
将被观察目标的对象传递给观察者。
观察者类实现java.util.Observer接口,并复写其中的update方法。
使用时需要添加观察者
Observable obj = new subObser();//继承Observable的子类
subObser.addObserver(observerImpl);//加入实现了Observer接口的观察者实现类
四、观察者的优缺点
优点:
- 观察者模式实现了观察者和目标之间的抽象耦合;
- 观察者模式实现了动态联动;
- 观察者模式支持广播通信;
缺点:可能会引起无谓的操作
建议在以下情况中选用观察者模式
- 第一 当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化;
- 第二 如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变。
- 第三 当一个对象必须通知其他的对象,但是你又希望这个对象和其他被它通知的对象是松散耦合的。