设计模式之观察者模式
2021 algorithm观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在《设计模式》中的定义:在对象之间定义一个一对多的依赖,当一个对象(Subject)状态改变时候,所有依赖的对象都会自动收到通知。
图片来源:维基百科
动机
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”–一个对象(目标对象)的状态发生改变,所有的依赖对象(观察着对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件系结构的松耦合。
方案
- 定义目标(Subject)和观察者(Observer)对象。
- 当一个目标(Subject)改变状态时,所有注册的观察者都会收到通知并且更新。
Subject 的唯一指责就是维护一个观察者列表,且通知它们通过调用自身的 update() 操作。观察者的指责主要是在 Subject 上注册(或注销)自己以获取状态更改的通知,且在收到通知时更新自身的状态(将自身的状态与 Subject 的状态同步)。
实例
使用 JavaScript 实现:
let Subject = {
_state: 0,
_observers: [],
add: function(observer) {
this._observers.push(observer);
},
getState: function() {
return this._state;
},
setState: function(value) {
this._state = value;
for (let i = 0; i < this._observers.length; i++)
{
this._observers[i].signal(this);
}
}
};
let Observer = {
signal: function(subject) {
let currentValue = subject.getState();
console.log(currentValue);
}
}
Subject.add(Observer);
Subject.setState(10);
//Output in console.log - 10
总结
使用面向对象的抽象,Observer 模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
目标发送通知时,无需指定观察者,通知会自动传播。
观察者自己决定是否需要订阅通知,目标对象对此一无所知。
Observer 模式是基于事件的 UI 框架中非常常用的设计模式,也是 MVC 模式的一个重要组成部分。
其他
设计模式要干的事情就是解耦。创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦,具体到观察者模式,它是将观察者和被观察者代码解耦。
同步阻塞是最经典的实现方式,主要是为了代码解耦;异步非阻塞除了能实现代码解耦之外,还能提高代码的执行效率;进程间的观察者模式解耦更加彻底,一般是基于消息队列来实现,用来实现不同进程间的被观察者和观察者之间的交互。
参考链接
- 《李建忠:C++设计模式》- 观察者模式
- Wiki: Observer pattern