本文共 1640 字,大约阅读时间需要 5 分钟。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
比如:当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为模式。意图: 定义对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
主要解决: 一个对象的状态改变给其它对象通知的问题, 而且要考虑到易用和低耦合,保证高度的协作。何时使用: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。如何解决: 使用面向对象技术,可以将这种依赖关系弱化。关键代码: 在抽象类里有一个ArrayList存放观察者们。应用实例:优点:
缺点:
使用场景:
注意事项:
首先需要扩展java.util.Observable接口产生“可观察者”类,然后需要两个步骤
当接收通知时,可以传递任何的数据对象(arg)给每一个观察者。
public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an Observable object's *notifyObservers
method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to thenotifyObservers
* method. */ void update(Observable o, Object arg);}
推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递 给观察者,让观察者自己去按需要取值。
推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数(Object),可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者是干脆重新实现观察者;
而拉模型就不会造成这样的情况,因为拉模型下, update()方法的参数是主题对象本身(Observable),这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要。转载地址:http://yzwex.baihongyu.com/