观察者模式
前言: 本文仅作为第一次学习设计模式的参考和笔记。 初探观察者模式:
观察者模式:Observer Pattern
又名:发布订阅模式。
原话:Define a one-to-many dependency between objects so that when one object changes state ,all its dependents are notified and updated automatically.
直译:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。(因为你变了,所以我们也变了)
定义:
被观察者(一个对象)改变某种状态,所有观察者(多个对象)会做出相应的反应。
示例类图:
- Subject:被观察者
- Observer观察者
- ConcreteSubject具体的被观察者
- ConcreteObserver具体的观察者
示例代码:
//被观察者:Subject
abstract class Subject{
//定义一个观察者数组
private Vector<Observer> ObsVector = new Vector<Observer>();
//增加一个观察者
public void addObserver(Observer o){
this.ObsVector.add(o);
}
//删除一个观察者
public void delObserver(Observer o){
this.ObsVector.remove(o);
}
//通知所有观察者
public void notifyObservers(){
for(Observer o:this.ObsVector){
o.update();
}
}
}
//具体的被观察者:ConcreteSubject
class ConcreteSubject extends Subject{
//具体的业务
public void doSomeThing(){
/*
* do something here!
*/
//最后 通知所有观察者
super.notifyObservers();
}
}
//观察者接口:Observer
instance Observer{
//更新方法
public void update();
}
//具体的观察者:ConcreteObserver
class ConcreteObserver implements Observer{
//实现更新方法
public void update(){
//becasuse of Subject ,ConcreteObserver do something here, and response!
}
}
public class Client{
public static void main(String[] args){
//1.创建一个被观察者
ConcreteSubject subject = new ConcreteSubject();
//2.定义一个观察者
Observer obs = new ConcreteSubject();
//3.观察者观察被观察者
subject.addObserver(obs);
//4.被观察者行动,所有观察者连锁行动
subject.doSomeThing();
}
}
优点:
- 观察者和被观察者之间 低耦合
- 可建立一套完美的连续触发机制
缺点:
- 复杂的调用,降低开发效率,以及运行效率
- 一个观察者卡住,整体会卡住(多采用多线程异步处理)
使用场景:
- 关联行为场景
- 事件多级触发场景
- 跨系统的消息交换场景
注意事项:
- 广播链问题: 一个对象可以有双重身份,既是观察者,又是被观察者。逻辑复杂,可维护性降低。一个项目最好最多只出现一个对象既是观察者又是被观察者,这比较好控制。
- 异步处理问题: 如果观察者比较多,处理时间较长,使用多线程异步处理,多线程异步就要考虑到 “线程的安全” 和 “队列”的问题。
扩展:
JAVA的JDK中,提供了java.util.Observable实现类和java.util.Observer接口。可以直接继承使用,更加简单方便。