设计模式--观察者模式

一 简介

观察者模式(observer pattern): 属于行为型设计模式。在对象之间定义一对多的依赖, 这样一来, 当一个对象改变状态, 依赖它的对象都会收到通知, 并自动更新。

二 意图

定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。

三 结构

目标 (Subject)具有注册和移除观察者、并通知所有观察者的功能,主要是通过维护一张观察者列表来实现这些操作的。

观察者(Observer)的注册功能需要调用目标的 registerObserver()方法。

Subject(目标):被观察者,它是指被观察的对象。

ConcreteSubject(具体目标):具体目标是目标类的子类,通常它包含经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。

Observer(观察者) :观察者将对观察目标的改变做出反应,观察者一般定义为接口 ,该接口声明了更新数据的方法 update(),因此又称为抽象观察者。

ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者 Observer 中定义的 update()方法。

四 代码实现

目标类:Subject

java 复制代码
abstract class Subject {
    private Vector<Observer> obs = new Vector();

    public void addObserver(Observer obs){
        this.obs.add(obs);
    }
    public void delObserver(Observer obs){
        this.obs.remove(obs);
    }
    protected void notifyObserver(){
        for(Observer o: obs){
            o.update();
        }
    }
    public abstract void doSomething();
}

具体的目标类:ConcreteSubject

java 复制代码
class ConcreteSubject extends Subject {
    public void doSomething(){
        System.out.println("被观察者事件发生改变");
        this.notifyObserver();
    }
}

观察者接口:Observer

java 复制代码
interface Observer {
    public void update();
}

具体的观察者:ConcreteObserver1、2

java 复制代码
class ConcreteObserver1 implements Observer {
    public void update() {
        System.out.println("观察者 1 收到信息,并进行处理");
    }
}
class ConcreteObserver2 implements Observer {
    public void update() {
        System.out.println("观察者 2 收到信息,并进行处理");
    }
}
 

客户类调用:

java 复制代码
public class Client {
    public static void main(String[] args){
        Subject sub = new ConcreteSubject();
        sub.addObserver(new ConcreteObserver1()); //添加观察者 1
        sub.addObserver(new ConcreteObserver2()); //添加观察者 2
        sub.doSomething();
    }
}

输出:

plain 复制代码
被观察者事件发生改变
观察者 1 收到信息,并进行处理
观察者 2 收到信息,并进行处理

五 总结

优点

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
  • 目标与观察者之间建立了一套触发机制
  • 支持广播通信
  • 符合"开闭原则"的要求

缺点

  • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用
  • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率

使用场景

  • 当一个对象状态的改变需要通知其他对象,或实际对象是事先未知的或动态变化时,可使用观察者模式。
  • 当应用中的一些对象必须观察其他对象时,可使用该模式 但仅能在有限时间内或特定情况下使用。
相关推荐
wangbing11251 小时前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443565 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w8 小时前
什么是AOP
java
Cc.Y8 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck8 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787058 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev8 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha8 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞8 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu9 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++