设计模式 - 浅谈观察者模式

观察者模式

模式功能说明:让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

模式思路与原理

观察者模式的主要角色有两种:观察者(Observer)被观察者(Subject)。被观察者持有观察者的集合,当被观察者的状态发生变化时,会通知所有的观察者。

代码示例

import java.util.ArrayList;
import java.util.List;

// 被观察者
class Subject {
    private List<Observer> observers = new ArrayList<Observer>();

    public void attach(Observer observer){
        observers.add(observer);       
    }

    public void detach(Observer observer){
        observers.remove(observer);       
    }

    public void notifyObservers(String newState){
        for(Observer observer : observers){
            observer.update(newState);
        }
    }
}

// 观察者
interface Observer {
    public void update(String state);
}

class ConcreteObserver implements Observer {
    private String observerState; 

    @Override
    public void update(String state) {
        observerState = state;
        System.out.println("状态为:"+observerState);
    }
}

Subject是被观察者,它持有一组观察者,当它的状态发生变化时,会通知所有的观察者。ConcreteObserver是具体的观察者,当接收到被观察者的通知时,会更新自己的状态。

使用场景:

  • 观察者模式常用于实现事件处理系统,消息推送系统,数据同步等场景。

优缺点

优点

  1. 观察者和被观察者之间是抽象耦合关系,符合依赖倒置原则。
  2. 观察者模式支持广播通信。

缺点

  1. 如果一个被观察者对象有很多的直接和间接的观察者,将所有的观察者都通知到会花费很多时间。
  2. 如果在观察者和被观察者之间存在循环依赖,可能导致系统崩溃。
  3. 观察者只知道被观察者发生了改变,但是不知道是怎么发生变化的。

总结

观察者模式实现了设计原则中的“开闭原则”,即对扩展开放,对修改关闭。当我们需要增加新的观察者时,只需要实现Observer接口即可,无需修改Subject的代码。 观察者模式实现了低耦合,非侵入式的通知与更新机制。


本文链接:

https://pugqq.com/archives/observer-pattern.html
设计模式 - 浅谈观察者模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21