(十 八)趣学设计模式 之 观察者模式!

在这里插入图片描述

目录

    • 一、 啥是观察者模式?
    • 二、 为什么要用观察者模式?
    • 三、 观察者模式的实现方式
    • 四、 观察者模式的优缺点
    • 五、 观察者模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解状态模式请看: (十 七)趣学设计模式 之 状态模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的观察者模式

一、 啥是观察者模式?

想象一下,你订阅了一个你喜欢的博主的博客 ✍️。 只要博主发布了新的文章,你就会立刻收到通知 🔔。 观察者模式就像是这种订阅机制,当一个对象(博主)的状态发生改变时,所有依赖于它的对象(订阅者)都会收到通知并自动更新。

观察者模式,就是定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有观察者对象,使它们能够自动更新 🎁。

简单来说,就是让多个“粉丝”时刻关注着“偶像”,一旦“偶像”有啥动静,“粉丝”们立刻知道!

  • 一个对象的状态改变需要通知多个其他对象: 就像博主发布新文章需要通知所有订阅者 📢!
  • 对象之间的依赖关系应该是松耦合的: 就像订阅者可以随时取消订阅,而不会影响博主的正常运作 🤝!
  • 你需要实现发布-订阅(Publish-Subscribe)模式: 就像博主发布文章,订阅者接收通知 📰!

二、 为什么要用观察者模式?

用观察者模式,好处多多 👍:

  • 解耦主题和观察者: 主题对象不需要知道观察者对象的具体类型,只需要知道它们实现了观察者接口 🤝!
  • 支持广播通信: 主题对象可以同时通知多个观察者对象 📣!
  • 动态添加和删除观察者: 可以方便地添加和删除观察者对象,而无需修改主题对象的代码 ➕➖!
  • 提高代码的可维护性和可扩展性: 将主题和观察者的逻辑分离,使得代码更加清晰易懂 💡!

三、 观察者模式的实现方式

观察者模式主要包含两个核心概念:

  • 主题(Subject): 也称为可观察对象,维护一个观察者列表,并提供添加、删除和通知观察者的方法 🏠!
  • 观察者(Observer): 定义了一个更新接口,当主题对象的状态发生改变时,会调用这个接口来通知观察者 ⚙️!
// 观察者接口:订阅者public interface Observer {void update(String message); // 更新消息
}// 具体观察者:用户public class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到消息: " + message);}
}// 主题接口:公众号public interface Subject {void registerObserver(Observer observer); // 注册观察者void removeObserver(Observer observer); // 移除观察者void notifyObservers(String message); // 通知观察者
}// 具体主题:微信公众号public class WeChatOfficialAccount implements Subject {private List<Observer> observers = new ArrayList<>();private String message;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {this.message = message;for (Observer observer : observers) {observer.update(message);}}public void publishMessage(String message) {System.out.println("公众号发布消息: " + message);notifyObservers(message);}
}// 客户端public class Client {public static void main(String[] args) {// 创建公众号WeChatOfficialAccount officialAccount = new WeChatOfficialAccount();// 创建用户User user1 = new User("张三");User user2 = new User("李四");User user3 = new User("王五");// 注册用户officialAccount.registerObserver(user1);officialAccount.registerObserver(user2);officialAccount.registerObserver(user3);// 发布消息officialAccount.publishMessage("今天发布了一篇新文章!");// 移除用户officialAccount.removeObserver(user2);// 再次发布消息officialAccount.publishMessage("明天要举办一个活动!");}
}

代码解释

  • Observer 接口是观察者接口,定义了 update 方法,用于接收主题对象发送的通知。
  • User 类是具体观察者,实现了 Observer 接口,负责处理接收到的通知。
  • Subject 接口是主题接口,定义了 registerObserverremoveObservernotifyObservers 方法,用于管理观察者列表和发送通知。
  • WeChatOfficialAccount 类是具体主题,实现了 Subject 接口,负责维护观察者列表和发送通知。

输出结果

公众号发布消息: 今天发布了一篇新文章!
张三 收到消息: 今天发布了一篇新文章!
李四 收到消息: 今天发布了一篇新文章!
王五 收到消息: 今天发布了一篇新文章!
公众号发布消息: 明天要举办一个活动!
张三 收到消息: 明天要举办一个活动!
王五 收到消息: 明天要举办一个活动!

四、 观察者模式的优缺点

优点:

  • 解耦主题和观察者 🤝!
  • 支持广播通信 📣!
  • 动态添加和删除观察者 ➕➖!
  • 提高代码的可维护性和可扩展性 💡!

缺点:

  • 如果观察者过多,通知会消耗大量资源 😫!
  • 观察者之间可能存在循环依赖,导致系统崩溃 🤯!
  • 难以保证通知的可靠性,如果某个观察者处理通知失败,可能会影响其他观察者 😞!

五、 观察者模式的应用场景

  • GUI 事件处理: 按钮点击、鼠标移动等等 🖱️!
  • 消息队列: 发布-订阅模式 📨!
  • 股票行情: 股票价格变化通知 📈!
  • 天气预报: 天气变化通知 ☀️🌧️!

六、 总结

  • 观察者模式就像“偶像”和“粉丝”,一旦“偶像”有啥动静,“粉丝”们立刻知道! 🤩
  • 核心概念包括主题和观察者! 🔑
  • 优点是解耦主题和观察者、支持广播通信、动态添加和删除观察者、提高代码的可维护性和可扩展性! 👍
  • 缺点是如果观察者过多,通知会消耗大量资源、观察者之间可能存在循环依赖、难以保证通知的可靠性! 👎
  • 适用于一个对象的状态改变需要通知多个其他对象,并且对象之间的依赖关系应该是松耦合的场景! 🎯

希望这篇文章能让你彻底理解观察者模式! 💯 祝你学习愉快! 😄
看完请看:(十 九)趣学设计模式 之 中介者模式!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 缓存最佳实践:从基础到生产的完整指南

Spring Boot 缓存最佳实践&#xff1a;从基础到生产的完整指南 引言 在现代分布式系统中&#xff0c;缓存是提升系统性能的银弹。Spring Boot 通过 spring-boot-starter-cache​ 模块提供了开箱即用的缓存抽象&#xff0c;但如何根据业务需求实现灵活、可靠的缓存方案&#xf…

苹果Siri升级遇阻,国行iPhone或将引入阿里、百度AI自救

AI整合进展缓慢 苹果正加速将生成式AI技术整合至Siri&#xff0c;但内部消息称其底层技术研发落后于竞争对手&#xff0c;进展未达预期。 国行iPhone将引入双AI模型 苹果计划在2025年中期为国行iPhone引入AI功能&#xff0c;目前已敲定与 阿里巴巴、百度 合作&#xff0c;用户…

阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1

阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型&#xff01;这款模型不仅名字萌萌哒(QwQ)&#xff0c;实力更是不容小觑&#xff01;&#x1f60e; QwQ-32B 已在 Hugging Face 和 ModelScope 开源&#xff0c;采用了 Apache 2.0 开源协议。大家可通过 Qwen C…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图&#xff0c;与 jre&#xff0c;应用程序之前的关系 安装使用 tomcat 10 开始&#xff0c;api 从 javax.* 转为使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默认 gbk 编码&#xff0c;解决控制…

JDK ZOOKEEPER KAFKA安装

JDK17下载安装 mkdir -p /usr/local/develop cd /usr/local/develop 将下载的包上传服务器指定路径 解压文件 tar -zxvf jdk-17.0.14_linux-x64_bin.tar.gz -C /usr/local/develop/ 修改文件夹名 mv /usr/local/develop/jdk-17.0.14 /usr/local/develop/java17 配置环境变量…

高考數學。。。

2024上 具体来说&#xff0c;直线的参数方程可以写为&#xff1a; x1t y−t z1t 二、简答题(本大题共5小题&#xff0c;每小题7分&#xff0c;共35分。) 12.数学学习评价不仅要关注结果评价&#xff0c;也要关注过程评价。简要说明过程评价应关注哪几个方面。…

C# 实现鼠标轨迹录制与回放自动化功能(附源码)

在软件自动化测试或者重复性办公任务中&#xff0c;鼠标操作的自动化可以大大减少人工干预&#xff0c;提高工作效率。这里将详细介绍如何使用 C# 实现鼠标轨迹的录制与回放功能&#xff0c;代码结构清晰&#xff0c;具有较强的扩展性。 引用 NuGet 包 在开发这个功能时&…

Nacos 核心功能实战笔记(超详细)

Nacos 核心功能实战笔记 一、Nacos 简介 1. 是什么&#xff1f; 全称&#xff1a;Nacos Naming and Configuration Service定位&#xff1a;阿里巴巴开源的 动态服务发现、配置管理、服务管理平台核心功能&#xff1a;服务注册与发现 统一配置管理 服务健康监测适用场景&…

安装remixd,在VScode创建hardhat

在终端&#xff0c;以管理员身份&#xff0c;cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中&#xff0c;安装solidity插件&#xff0c;是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件&#xff0c;在终端输入 npx hardhat 3.…

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义&#xff0c;cyberrt中timer模块用于设置定时器任务&#xff0c;字面意思&#xff0c;设置设置定时周期及出发频次&#xff08;周期 or oneshot)&#xff0c;到达指定时间时间触发callback time wheel 时钟节拍轮&#xff0c;常见的定时器设计&#x…

java八股文之消息中间件

1.RabbitMQ如何保证消息不丢失 开启生产者确认机制&#xff0c;确保生产者的消息能到达队列开启持久化功能&#xff0c;确保消息未消费前在队列中不会丢失&#xff08;交换机&#xff0c;队列&#xff0c;消息都需要开启持久化功能&#xff09;开启消费者确认机制为auto,由spr…

Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册

一、写在前面&#xff1a;为什么你需要这份教程&#xff1f; 当电脑频繁蓝屏、系统崩溃甚至无法开机时&#xff0c;重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点&#xff1a; ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…

大学至今的反思与总结

现在是2025年的3月5日&#xff0c;我大三下学期。 自大学伊始&#xff0c;我便以考研作为自己的目标&#xff0c;有时还会做自己考研上岸头部985,211&#xff0c;offer如潮水般涌来的美梦。 但是我却忽略了一点&#xff0c;即便我早早下定了决心去考研&#xff0c;但并没有早…

SpringBoot 全局异常处理

文章目录 异常处理全局异常处理(推荐)局部异常处理高级技巧设置返回状态码处理404异常异常处理 全局异常处理(推荐) 创建一个全局异常处理类,使用 @RestControllerAdvice 注解标记。 在方法上使用 @ExceptionHandler 声明当前方法可处理的异常类型。当系统发生异常时,…

【四.RAG技术与应用】【11.阿里云百炼应用(上):RAG在云端的实践】

一、为什么需要RAG?大模型的“知识困境”与破局之道 大模型虽然“博学”,但它的知识库存在两个致命短板: 缺乏私有知识:比如企业内部的产品手册、客户数据、行业报告等;知识更新滞后:大模型的训练数据往往停留在某个时间点,无法实时获取最新信息(比如今天的股票行情或…

使用wifi连接手机adb进行调试|不使用数据线adb调试手机|找应用错误日志和操作日志

手机在开发者选项里要开启无线调试 在手机设置中查看WiFi的IP地址 设置 -> WLAN -> 已连接的WiFi -> IP地址 使用手机的IP地址连接 adb connect 192.168.1.12:xxxxx 检查连接状态 adb devices 断开特定设备 adb disconnect 192.168.x.x:xxxxx 断开所有设备 …

mapbox高阶,结合threejs(threebox)添加三维球体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式&#xff0c;声音在技术上是一个非常特别的存在&#xff0c;但在游戏中进行声音混音的需求其实相对简单明了&#xff0c;所以今天的任务应该不会太具挑战性。 今天我们会编写一个…

golang并发编程如何学习

《掌握 Golang 并发编程的通关秘籍》 在当今的编程世界中&#xff0c;Golang 并发编程正以其独特的魅力和强大的能力吸引着众多开发者。然而&#xff0c;对于许多小伙伴来说&#xff0c;如何学好这门技术却成了一个头疼的问题。别担心&#xff0c;今天就让我来为大家揭开 Gola…