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

观察者模式

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

模式思路与原理

观察者模式的主要角色有两种:观察者(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
快来做第一个评论的人吧~

# 最近更新

JDK国内镜像加速下载2023-05-02

博客评论系统增加悄悄话/匿名留言模式2023-04-10

博客评论系统引入极验api2023-03-22

博客评论系统表情栏优化2023-02-04

centos用firewalld开放端口2022-08-12

数据结构与算法之红黑树2022-03-12

数据结构与算法之字典树2022-03-02

数据结构与算法之LSM树2022-02-24

数据结构与算法之B+树2022-02-15

数据结构与算法之堆2022-02-12