前言:
本文仅作为第一次学习设计模式的参考和笔记。
初探观察者模式:
观察者模式: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.
直译:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。(因为你变了,所以我们也变了)
1. 定义:被观察者(一个对象)改变某种状态,所有观察者(多个对象)会做出相应的反应。
2. 示例类图:
- Subject:被观察者
- Observer观察者
- ConcreteSubject具体的被观察者
- ConcreteObserver具体的观察者
3. 示例代码:
//被观察者: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();
}
}
4. 优点:
- 观察者和被观察者之间 低耦合
- 可建立一套完美的连续触发机制
5. 缺点:
- 复杂的调用,降低开发效率,以及运行效率
- 一个观察者卡住,整体会卡住(多采用多线程异步处理)
6. 使用场景:
- 关联行为场景
- 事件多级触发场景
- 跨系统的消息交换场景
7. 注意事项:
- 广播链问题:
一个对象可以有双重身份,既是观察者,又是被观察者。逻辑复杂,可维护性降低。一个项目最好最多只出现一个对象既是观察者又是被观察者,这比较好控制。 - 异步处理问题:
如果观察者比较多,处理时间较长,使用多线程异步处理,多线程异步就要考虑到 “线程的安全” 和 “队列”的问题。