观察者模式(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 interface Observable {
//添加一个观察者
public void addObserver(Observer observer);
//删除一个观察者
public void deleteObserver(Observer observer);
//通知所有观察者
public void notifyObservers(String context);
}
具体实现类
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");
}
}
观察者接口
public interface Observer {
//根据被观察者推送的信息,观察者进行更新信息
public void update(String context);
}
具体的client中
说下思路
先建立subject实例
然后建立不同的观察者实例
subject里面添加不同的观察者实例(当然也可以删除)
在subject更新事件的时候(可以通知观察者)
优点
- 观察者和被观察者之间是抽象耦合(增加观察者还是被观察者都非常容易扩展)
- 建立一套触发机制(被观察者改变,触发导致观察者发生变化)
缺点
- 观察者模式需要考虑开发效率和运行效率,一个被观察者,多个观察者。开发和调试比较复杂,而且java中消息通知是顺序执行,一个观察者卡壳或者挂了,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。
异步处理问题
异步处理就要考虑线程安全和队列的问题,还是看一看Message Queue,会有更深的了解。(作者表示:没看过,以后再看)