240121-观察者模式

67 阅读1分钟

定义

什么是观察者模式?它的作用是什么?

当一个对象状态发生了变化,订阅它的其他对象收到通知并作出相应变化。
作用是减少依赖关系,解耦合。

通俗的例子就是报纸的运作模式,或者服务大厅的叫号。

image.png

  • Subject(抽象主题): 一个可观察的接口,通知观察者使用attach方法,以及取消观察的detach方法。
  • ConcreteSubject(具体主题): 是一个实现主题接口的类,处理观察者的变化
  • Observer(抽象观察者): 一个通知订阅者的接口,根据主题中的更改而进行更新。
  • ConcreteObserver(具体观察者):根据观察者改变做出具体改变。

代码示例

抽象主题

public interface Subject {
    // 添加订阅关系
    void attach(Observer observer);

    // 移除订阅关系
    void detach(Observer observer);

    // 通知订阅者
    void notifyObservers(String message);
}

抽象订阅者

public interface Observer {
    // 处理更新业务逻辑
    void update(String message);
}

具体主题:人民日报

// 人民日报
public class RenMinRiBao implements Subject{

    // 维护读者的容器
    private List<Observer> readers = new ArrayList();

    @Override
    public void attach(Observer observer) {
        readers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        readers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : readers){
            observer.update(message);
        }
    }
}

具体订阅者:读者

public class Reader implements Observer{

    // 读者姓名
    private String name;

    Reader(String name){
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + "读到了《" + message + "》");
    }
}

测试类

public class ObserverTest {

    public static RenMinRiBao renMinRiBao = new RenMinRiBao();

    public static void main(String[] args) {
        Reader liHua = new Reader("liHua");
        Reader liBai = new Reader("liBai");

        renMinRiBao.attach(liHua);
        renMinRiBao.notifyObservers("床前明月光");

        renMinRiBao.attach(liBai);
        renMinRiBao.notifyObservers("疑是地上霜");

    }
}

输出结果

liHua读到了《床前明月光》
liHua读到了《疑是地上霜》
liBai读到了《疑是地上霜》

框架

参考文章:

阿里P6+面试:介绍下观察者模式? - 掘金 (juejin.cn)