[设计模式] 浅谈观察者模式

2024 年 5 月 9 日 星期四
/ ,
3

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

观察者模式

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

模式思路与原理

观察者模式的主要角色有两种:观察者(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的代码。 观察者模式实现了低耦合,非侵入式的通知与更新机制。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...