当前位置: 首页 > article >正文

设计模式之观察者模式

概述

观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会自动收到通知并进行更新。

在 Java 中,可以使用 java.util.Observable 和 java.util.Observer 来实现观察者模式。其中,Observable 是主题对象,Observer 是观察者对象。

具体实现步骤如下:
定义主题对象(Observable)和观察者对象(Observer)。
在主题对象中定义一个用于添加和移除观察者的方法,并在数据发生变化时通知所有观察者。
在观察者对象中实现 update() 方法,用于接收主题对象的通知并进行相应的处理。

示例

主题对象(Observable):

import java.util.Observable;

public class Subject extends Observable {
    private int data;

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
        setChanged();
        notifyObservers();
    }
}

观察者对象(Observer):

import java.util.Observable;
import java.util.Observer;

public class ObserverA implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("ObserverA received the update.");
    }
}

public class ObserverB implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("ObserverB received the update.");
    }
}

使用示例:

public class Test {
    public static void main(String[] args) {
        Subject subject = new Subject();
        ObserverA observerA = new ObserverA();
        ObserverB observerB = new ObserverB();
        subject.addObserver(observerA);
        subject.addObserver(observerB);
        subject.setData(1);
    }
}

输出结果:

ObserverA received the update.
ObserverB received the update.

说明

可以看到,当主题对象的数据发生变化时,所有的观察者都会收到通知并进行相应的处理。

总结

观察者模式的优点包括:

  1. 降低了系统的耦合度,被观察者和观察者之间的关系松散,易于扩展。
  2. 可以实现广播通信,被观察者不需要知道观察者的存在,只需要通知即可。
  3. 观察者模式符合开闭原则,增加新的观察者不会影响被观察者的代码。

观察者模式的缺点包括:

  1. 如果观察者过多,通知所有观察者的时间会很长,影响系统性能。
  2. 观察者和被观察者之间的关系是双向的,增加了系统的复杂度。
  3. 如果观察者和被观察者之间存在循环依赖,会导致系统崩溃。

http://www.kler.cn/a/5398.html

相关文章:

  • 单片机-独立按键矩阵按键实验
  • 【openwrt】OpenWrt 路由器的 802.1X 动态 VLAN
  • 物体切割效果
  • 代码随想录算法训练营第二十四天-回溯算法-90. 子集II
  • mmsegmentation中img_scale的作用
  • jest使用__mocks__设置模拟函数不生效 解决方案
  • 这几种常见的 JVM 调优场景
  • Java日期查询
  • C++进阶 — 特殊类设计
  • 基于文件完整性校验的恶意代码检测器设计
  • 使用JS+HTML+CSS模拟操作系统
  • 全程序优化
  • Android 9.0 系统关机动画的功能实现
  • EM7电磁铁的技术参数
  • C/C++ Struct用法详解
  • T-SQL考试题
  • 信号 捕捉
  • Springboot项目如何设计接口中敏感字段的加密、解密
  • 银翼杀手2049——依稀可见的存储未来
  • 嵌入式开发的一些经典书籍
  • 2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结
  • 【中级软件设计师】—数据库系统考点总结篇(三)
  • 第15章_锁
  • Python每日一练(20230402)
  • SVN学习笔记(一)基础知识
  • MATLAB R2020a介绍