观察者模式

发布时间 2023-04-12 20:32:21作者: FatalFlower

概述

《设计模式》一书中对于观察者模式的意图描述如下:

> 定义对象中的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被更新

观察者模式的 UML 图如下所示:

observer_pattern.png

一般在以下情况下使用观察者模式:

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中,使得它们可以各自独立地改变和复用
  • 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变
  • 一个对象必须通知其他对象,而它又不能假定其它对象是谁,也就是说,这些对象之间并不是耦合的

具体示例

对于一个多组件的页面来讲,这些组件之间是独立的。然而,有时候可能不得不将它们组合在一个页面中,统一响应对应的操作(如保存等),这些组件之间对于 “保存” 这一个操作的处理逻辑并不相同,因此需要每个组件进行隔离处理。对于页面来讲,它实际并不知道到底有多少个组件会被处理,在这种情况下,就很适合使用 “观察者模式” 来处理这一逻辑

首先,我们定义每个组件的抽象接口 Component

public interface Component { // 实际上这里的 Component 就相当于 Observer
    void saveInfo(); // 保存当前组件内的有关信息
}

对于页面来讲,实际上它就相当于每个组件订阅的主题(即 Subject),这可以是一个具体的实例类:

public class PageSubject {
    private final List<component> compList = new ArrayList&lt;&gt;();
    
    public void addComponent(Component comp) {
        compList.add(comp);
    }
    
    public void save() { // 当发起 “保存” 这一指令时,通知所有的观察者
        for (Component comp : compList) {
            comp.saveInfo();
        }
    }
}

总结

如果希望避免一对多的依赖对象的耦合关系,通过观察者模式可以有效地达到这一目的


参考:

[1] 《设计模式—可复用面向对象基础》