观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是在一个项目中经常使用的模式,定义如下: Define a one-to-mang dependency between objects so that when one object changes state,all its dependents are notified and updated automatically (定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
Subject:被观察者
定义被观察者必须实现的职责,它必须能够动态添加、删除观察者。它一般 是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者(notifyObservers)
Observer观察者
观察者收到信息后,即进行update操作,对接收的信息进行处理 观察者是被被观察者管理的
ConcreteSubject具体的被观察者
定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。
ConcreteObserver具体的观察者
每个观察者在接收到消息后处理反应是不同,各个观察者有自己的处理逻辑。
具体实现类
public class Subject implements Observable{ //定义一个观察者数组 private Vector<Observer> obsverVector = new Vector<Observer>(); //添加一个观察者 public void addObserver(Observer observer){ obsver.add(observer); } //删除一个观察者 public void deleteObserver(Observer observer){ obsverVector.remove(obserber); } //通知所有观察者 public void notifyObservers(String context){ for(Observer o : obsverVector){ o.update(context); } } //业务逻辑,dosomething时通知所有在数组中的观察者 public void dosomething(){ /** dosth */ notifyObservers("dosth"); } }优点
观察者和被观察者之间是抽象耦合(增加观察者还是被观察者都非常容易扩展)建立一套触发机制(被观察者改变,触发导致观察者发生变化)缺点
观察者模式需要考虑开发效率和运行效率,一个被观察者,多个观察者。开发和调试比较复杂,而且java中消息通知是顺序执行,一个观察者卡壳或者挂了,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。异步处理问题 异步处理就要考虑线程安全和队列的问题,还是看一看Message Queue,会有更深的了解。(作者表示:没看过,以后再看)