介绍
定义
对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
说明
也叫发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式,一个对象发送改变时将自动通知其他对象,其他对象将相应做出反应。发生改变的对象叫做观察目标,被通知的对象称为观察者,一个观察目标可以对应多个观察者。而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者。(实际上就是使用回调,被观察者持有观察者的实例,在收到某个消息的时候执行回调函数。)
具体实现
抽象观察目标
interface Subject{
//增加订阅者
public void attach(Observer o);
//删除订阅者
public void detach(Observer o);
//通知订阅者更新消息
public void notify();
}
具体观察目标
class ConcreteSubject implement Subject {
private List<Observer> mList = new ArrayLis<Observer>();
@Overried
public void attach(Observer o){
mList.add(o);
}
@Overried
public void detach(Observer o){
mList.remove(o);
}
@Overried
public void notify(String msg) {
for (Observer o : mList) {
o.update(msg);
}
}
}
抽象观察者
interface Observer{
public void update(String msg);
}
具体观察者
class ConcreteObserver implement Observer{
public ConcreteSubject() {}
@Overried
public void update(String msg){
//TODO
}
}
使用
ConcreteSubject subject = new ConcreteSubject();
subject.attach(new ConcreteObserver());
使用场景
- 关场景行为
- 事件多级触发
- 跨系统的消息交换场景,如消息队列、事件总线的处理机制
优点
- 解除耦合,让耦合的双方都依赖于抽象
缺点
- 要考虑开发效率和运行效率,调试比较复杂。如果一个观察者卡顿后面的都会卡顿,可以考虑异步实现。
基本上转载自: