23种设计模式-观察者(Observer)设计模式

server/2025/3/28 4:09:18/

观察者设计模式

🚩什么是观察者模式

观察者模式(Observer Pattern) 是一种 行为型设计模式,它定义了一种 一对多的依赖关系,使得 一个对象(被观察者) 的状态发生变化时,所有依赖它的 观察者 都会收到通知并自动更新。

使用场景

  • 事件驱动系统(如 GUI 事件监听)

  • 消息订阅-发布系统

  • 数据同步更新(如缓存更新、数据库同步等)

  • MVC 设计模式中的视图更新

🚩观察者设计模式的特点

  • 解耦观察者与被观察者:被观察者只关心自身状态的变化,不关心谁在监听它。

  • 自动通知:状态变更后,所有观察者都会收到通知。

  • 动态注册和取消:观察者可以随时订阅或取消订阅。

🚩观察者设计模式的结构

观察者模式主要由以下角色组成:

  • Subject(被观察者):维护观察者列表,并在状态变化时通知所有观察者。

  • ConcreteSubject(具体被观察者):实际的被观察对象,实现 Subject 接口。

  • Observer(观察者接口):定义一个 update() 方法,用于接收被观察者的通知。

  • ConcreteObserver(具体观察者):实现 Observer 接口,接收通知并更新自身状态。

🚩观察者设计模式的优缺点

✅ 优点

  • 解耦被观察者和观察者,提高代码的灵活性。

  • 支持动态扩展,可以在运行时添加或移除观察者。

  • 符合开闭原则,可以增加新的观察者而无需修改被观察者。

❌ 缺点

  • 可能会有性能问题,如果观察者过多,通知开销可能较大。

  • 通知顺序不可控,多个观察者的执行顺序可能会有影响。

Java_52">🚩观察者设计模式Java实现

代码地址:GitHub

  • 先创建Observer(观察者)接口
/*** @author hanso* @description: 观察者接口* @date 2025-03-25 23:40:16* @version: 1.0*/
public interface Observer { // 观察者接口public void update(); // 收到通知 更新观察者的状态
}
  • 创建被观察者接口Subject
/*** @author hanso* @description: 被观察者接口* @date 2025-03-25 23:39:08* @version: 1.0*/
public interface Subject {// 目标public void Attach(Observer observer);// 添加观察者public void Detach(Observer observer);// 删除观察者public void Notify();// 状态改变后 通知所有观察者public void setState(String state);// 设置状态(改变状态)public String getState();// 获取状态
}
  • 创建具体的被观察者类(目标类)实现Subject接口
/*** @author hanso* @description: 具体被观察者* @date 2025-03-25 23:41:58* @version: 1.0*/
public class ConcreteSubject implements Subject {private String name;private String state;private List<Observer> observerList;public ConcreteSubject(String name) {state = "未更新";this.name = name;observerList = new ArrayList<Observer>();}@Overridepublic void Attach(Observer observer) {observerList.add(observer);}@Overridepublic void Detach(Observer observer) {observerList.remove(observer);}@Overridepublic void Notify() {// for (遍历对象类型 对象名 : 遍历对象)for (Observer observer : observerList) {observer.update();}}@Overridepublic void setState(String state) {this.state = state;System.out.println(name + "的状态发生变化,变化后的状态为:" + state);Notify();}@Overridepublic String getState() {return state;}
}
  • 创建具体的观察者类ConcreteObserver实现Observer接口
/*** @author hanso* @description: 具体观察者* @date 2025-03-25 23:44:32* @version: 1.0*/
public class ConcreteObserver implements Observer {private String name;private String state;private Subject subject;public ConcreteObserver(String name, Subject subject) {this.name = name;this.subject = subject;subject.Attach(this);state = subject.getState();}@Overridepublic void update() {System.out.println(name + "收到通知");state = subject.getState(); // 让当前观察者的状态 和 改变了状态之后的目标的状态保持一致System.out.println(name + "改变后的状态为:" + state);}
}
  • 测试观察者设计模型
/*** @author hanso* @description: 测试观察者模式* @date 2025-03-25 23:46:15* @version: 1.0*/
public class ObserverPattern {public static void main(String[] args) {Subject subjectA = new ConcreteSubject("目标A");ConcreteObserver observerB = new ConcreteObserver("张三", subjectA);ConcreteObserver observerC = new ConcreteObserver("李四", subjectA);ConcreteObserver observerD = new ConcreteObserver("王五", subjectA);subjectA.setState("更新了");System.out.println("======================================");subjectA.Detach(observerD);subjectA.setState("停更了");}
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • ConcreteSubject(具体被观察者) 维护观察者列表,并在状态更新时通知所有观察者。

  • ConcreteObserver(具体观察者) 在被观察者状态变化时,自动更新自身状态。

  • 使用 Attach() Detach()方法动态添加/移除观察者。

🚩总结

  • 观察者模式 适用于 事件驱动消息广播数据同步 等场景。

  • 解耦设计,被观察者和观察者独立,可以动态扩展。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述


http://www.ppmy.cn/server/179170.html

相关文章

人工智能与无人机:无人机的进步与应用技术详解

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新技术科学。 无人机&#xff0c;全称为无人驾驶飞行器&#xff08;UAV&#xff09;&#xff0c;也称为无人机器人、…

Java 基础入门代码示例解析

在 Java 编程的学习过程中&#xff0c;理解函数&#xff08;方法&#xff09;的使用以及简单系统功能的实现是非常重要的基础。本文将对一系列 Java 代码进行详细解析&#xff0c;这些代码涵盖了菜单驱动的功能选择、数据查询以及简单的 RBAC&#xff08;基于角色的访问控制&am…

简单选择排序

简单选择排序&#xff0c;很明显属于选择排序。 选择排序&#xff1a;每一趟在待排序元素中选取关键字最小&#xff08;或最大&#xff09;的元素加入有序子序列。 n个元素的简单选择排序需要n-1趟处理。 代码&#xff1a; void SelectSort(int A[],int n){int min_idx;//记…

进程通信(进程池的模拟实现) read write函数复习 Linux ─── 第23课

目录 write和read函数补充: 进程池(process pool) 第一步: 创建并初始化processpool 第二步:主进程对子进程派发任务 补充: 第三步: 子进程执行完退出进程池 回收子进程 Channel.hpp ProcessPool.hpp Task.hpp main.cc makefile write和read函数补充: const char …

LeetCode热题100精讲——Top4:移动零【双指针】

你好&#xff0c;我是安然无虞。 文章目录 题目背景移动零C解法Python解法 题目背景 如果大家对于 双指针 的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第七章——六道力扣经典带你刷爆双指针 移动零 题目链接&#xff1a;移动零 解题思路&…

笔记本+移动端维修全套教程

今天分享的是笔记本移动端维修全套教程&#xff08;免费视频资料大全&#xff09; 当自己手机或者电脑坏了&#xff0c;很多人都会想着去维修店铺修&#xff0c;但价格不透明&#xff0c;容易被坑&#xff0c;当自己了解一些之后&#xff0c;即使不会修&#xff0c;也可以对手…

计算机体系结构及存储系统入门

1.2 计算机体系结构 计算机体系结构(computer architecture)是指计算机的概念性结构、功能和性能特性&#xff0c;它从一个更高的层次对计算机的结构和特征等宏观特性进行研究。计算机体系结构分类如下所述: 从计算机体系架构的宏观视角出发&#xff0c;依据处理机数量&#x…

6.3 模拟专题:LeetCode 6. Z 字形变换

1. 题目链接 LeetCode 6. Zigzag Conversion 2. 题目描述 将一个给定字符串 s 按照指定的行数 numRows 进行 Z 字形排列后&#xff0c;逐行读取并返回新的字符串。 示例&#xff1a; 输入&#xff1a;s "PAYPALISHIRING", numRows 3 → 输出&#xff1a;"P…