观察者模式
概述
《设计模式》一书中对于观察者模式的意图描述如下:
定义对象中的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被更新
观察者模式的 UML 图如下所示:
![observer_pattern.png](https://s2.loli.net/2023/04/12/MW2ZxhFTSpN9m3e.png)
一般在以下情况下使用观察者模式:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中,使得它们可以各自独立地改变和复用
- 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变
- 一个对象必须通知其他对象,而它又不能假定其它对象是谁,也就是说,这些对象之间并不是耦合的
具体示例
对于一个多组件的页面来讲,这些组件之间是独立的。然而,有时候可能不得不将它们组合在一个页面中,统一响应对应的操作(如保存等),这些组件之间对于 “保存” 这一个操作的处理逻辑并不相同,因此需要每个组件进行隔离处理。对于页面来讲,它实际并不知道到底有多少个组件会被处理,在这种情况下,就很适合使用 “观察者模式” 来处理这一逻辑
首先,我们定义每个组件的抽象接口 Component
:
public interface Component { // 实际上这里的 Component 就相当于 Observer
void saveInfo(); // 保存当前组件内的有关信息
}
对于页面来讲,实际上它就相当于每个组件订阅的主题(即 Subject
),这可以是一个具体的实例类:
public class PageSubject {
private final List<Component> compList = new ArrayList<>();
public void addComponent(Component comp) {
compList.add(comp);
}
public void save() { // 当发起 “保存” 这一指令时,通知所有的观察者
for (Component comp : compList) {
comp.saveInfo();
}
}
}
总结
如果希望避免一对多的依赖对象的耦合关系,通过观察者模式可以有效地达到这一目的
参考:
[1] 《设计模式—可复用面向对象基础》