《程序猿之设计模式实战 · 观察者模式》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

      • 写在前面的话
      • 基础介绍
      • 代码实现
      • 观察者&发布订阅
      • 补充说明
      • 总结陈词

写在前面的话

本篇文章继续介绍一下观察者模式,这个在日常工作中接触还是挺多的,但和发布订阅模式又有什么不同呢?

相关文章:
《程序猿之设计模式实战 · 策略模式》
《程序猿之设计模式实战 · 装饰者模式》
《程序猿之设计模式实战 · 池化思想》


基础介绍

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件处理系统。

主要角色:

  1. 主题(Subject):被观察的对象,维护观察者的列表,并提供注册、注销观察者的方法。
  2. 观察者(Observer):对主题的变化感兴趣的对象,定义一个更新接口,以便接收主题的通知。

观察者模式的日常应用场景:

事件处理系统:如 GUI 应用中的按钮点击、文本框输入等事件的处理。

消息推送:社交媒体应用中,当用户发布新内容时,所有关注该用户的用户都会收到通知。

股票市场:当股票价格变化时,所有订阅该股票的投资者都会收到更新。

天气监测:天气预报应用中,用户可以订阅天气变化的通知。

日志系统:在日志框架中,多个观察者可以监听日志事件并执行相应的处理(如写入文件、发送邮件等)。


代码实现

Spring的事件用法就是典型的观察者模式。

实现步骤:

Step1、创建自定义事件

public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

Step2、创建事件监听器

@Component
public class CustomEventListener {@EventListenerpublic void handleCustomEvent(CustomEvent event) {System.out.println("Received custom event - Message: " + event.getMessage());}
}

Step3、创建事件发布者

@Component
public class EventPublisher {private final ApplicationEventPublisher publisher;public EventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;}public void publish(String message) {CustomEvent event = new CustomEvent(this, message);publisher.publishEvent(event);}
}

Step4、合适的位置触发一下事件,例如下方的服务初始化。

@Component
public class AppRunner implements CommandLineRunner {private final EventPublisher eventPublisher;@Autowiredpublic AppRunner(EventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}@Overridepublic void run(String... args) throws Exception {eventPublisher.publish("Hello, Observer Pattern!");}
}

观察者&发布订阅

观察者模式和发布-订阅模式(Publish-Subscribe Pattern)有相似之处,但它们之间也存在一些关键的区别:

1、耦合度:

观察者模式:主题和观察者之间是直接的依赖关系。观察者需要知道主题的存在,并注册到主题中。

发布-订阅模式:发布者和订阅者之间是解耦的。发布者不需要知道任何订阅者的存在,反之亦然。它们通过一个中介(如消息代理)进行通信。

2、通信方式:

观察者模式:通常是同步的,观察者在主题状态变化时立即收到通知。

发布-订阅模式:可以是同步或异步的,发布者发布消息后,订阅者可以在稍后时间接收消息。

3、使用场景:

观察者模式:适用于一对多的关系,通常在同一个应用程序中使用。

发布-订阅模式:适用于分布式系统或微服务架构,允许不同的应用程序或服务之间进行通信。

总结:

观察者模式和发布-订阅模式都用于实现事件驱动的架构,但它们在耦合度、通信方式和使用场景上有所不同。选择哪种模式取决于具体的需求和应用场景。


补充说明

按前面内容所介绍的,好像发布订阅模式的使用场景更广,比如 RedisTemplate.convertAndSend 方法在 Spring 中用于将消息发送到 Redis 的某个频道。这种机制可以被视为一种发布-订阅模式的实现,而不是严格的观察者模式。又比如Kafka 中的生产者和消费者的交互属于典型的发布-订阅模式。

这里再分析比对一下两者。

发布-订阅模式

使用场景:适用于需要在不同组件之间进行松耦合通信的场景。比如,使用 Redis、Kafka 等消息中间件时,发布者和订阅者之间没有直接的依赖关系。

优点:可以轻松扩展,添加新的订阅者不需要修改发布者的代码,适合分布式系统。

观察者模式

使用场景:通常用于对象之间的直接关系,适合在同一应用程序内部进行事件通知。Spring 的事件机制就是一个典型的例子。

优点:实现简单,适合在内存中处理事件,适合小范围的事件传播。

总结一下:

发布-订阅模式:适合跨服务或组件的通信,使用消息中间件。

观察者模式:适合在同一应用程序内部的事件处理,使用 Spring 的事件机制。

这两种模式各有其适用场景,选择时可以根据具体需求来决定。


总结陈词

还是那句话,不用过多的纠结在用的是哪个设计模式,实现的是什么标准。

遇到实际问题能使用合适的方式解决,同时代码经得起推敲和扩展,才是最主要的。

还是那句话,你可以不用,但不能不会。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

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

相关文章

摩尔-彭罗斯伪逆(pinv)

摩尔-彭罗斯伪逆是一种矩阵,可在不存在逆矩阵的情况下作为逆矩阵的部分替代。此矩阵常被用于求解没有唯一解或有许多解的线性方程组。 对于任何矩阵 A 来说,伪逆 B 都存在,是唯一的,并且具有与 A’ 相同的维度。如果 A 是方阵且非…

[Linux]自定义shell详解

自定义shell 前言1.命令行提示符,字符串的打印1.1命令行提示符2.命令行字符串 2.0对命令行字符串进行切割2.执行命令3.有趣的小问题完整代码 前言 写之前我们先看看一个完整的shell都包括了什么 $符号前面(包括这个符号)就是命令行提示符&a…

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中,我们经常需要重复使用复制的内容。然而,新内容一旦复制,旧内容就会被覆盖。因此,选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具,欢迎大家下…

OJ 旋转图像

题目: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例: 解题规律: 我们以题目中的示例二作为例子&a…

2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件

# 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件 前提按照之前的步骤打开deepfacelive正确配置并且在窗口已经输出了换脸后的视频,不懂步骤可以移步 https://doc.youyacao.com/88/2225 ## 首先下载obs并配置 https://obsproject.com/ 通过…

Vue: 创建vue项目

目录 一.创建项目 二.项目添加 三.添加成功 一.创建项目 打开本机终端输入npm create vuelatest 二.项目添加 1. 项目名称: Project name: one_vue 2.是否添加TypeScript支持:Add TypeScript? Yes 3.是否添加JSX支持:Add JSX Suppor…

英飞凌 PSoC6 评估板 CAPSENSE 触摸滑条应用示例

PSoC™ 62 with CAPSENSE™ evaluation kit 开发板(以下简称 PSoC 6 RTT 开发板)是英飞凌(Infineon)联合 RT-Thread 发布一款面向物联网开发者的 32 位双核 MCU 开发套件,其默认内置 RT-Thread 物联网操作系统。本文主…

《网络协议 - HTTP传输协议及状态码解析》

文章目录 一、HTTP协议结构图二、HTTP状态码解读1xx: 信息响应类2xx: 成功响应类3xx: 重定向类4xx: 客户端错误类5xx: 服务器错误类 一、HTTP协议结构图 二、HTTP状态码解读 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传…

java通过org.eclipse.milo实现OPCUA客户端进行连接和订阅

前言 之前写过一篇关于MQTT的方式进行物理访问的文章:SpringBoot集成MQTT,WebSocket返回前端信息_springboot mqtt websocket-CSDN博客 最近又接触到OPCUA协议,想通过java试试看能不能实现。 软件 在使用java实现之前,想着有没…

品牌力是什么?如何评估企业品牌影响力?

品牌影响力,其实就是指品牌在消费者心智中所占据的位置,以及它对消费者购买决策和行为的影响力。如果一个企业的品牌影响力越强,它在消费者心中的印象就越深刻,能够更有效地驱动消费者的购买行为,形成品牌忠诚度&#…

2024.9.20营养小题【2】(动态分配二维数组)

这道题里边涉及到了动态分配二维数组的知识点,不刷这道题我也不知道这个知识点,算是一个比较进阶一点的知识点了。 参考:C语言程序设计_动态分配二维数组_哔哩哔哩_bilibili【C/C 数据结构 】二维数组结构解析 - 知乎 (zhihu.com)

JSONC:为JSON注入注释的力量

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web开发、配置文件和数据存储等领域。 其简洁的语法和易于解析的特点,使得JSON成为了现代编程中不可或缺的一部分。然而,JSON的一个显著缺点是…

迁移学习+多模态融合,小白轻松发一区!创新性拉满!

多模态研究如今愈发火热,已成为各大顶级会议的投稿热门。今天,我为大家提供一个多模态的创新思路:迁移学习与多模态融合。 迁移学习多模态融合方向的优势 1.提升模型性能:综合更多维度优势,跨模态互补 2.快速适应新…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 1、假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的; 当线程A执行完第六行由于时间…

VuePress搭建文档网站/个人博客(详细配置)主题配置-侧边栏配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【C++ 学习】多态的基础和原理(10)

目录 前言1. 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数重写2.4 虚函数重写的例外2.4.1 协变2.4.1 析构函数的重写 2.5 多态调用和普通调用2.6 函数重写/函数隐藏/函数重载 的对比2.6.1 函数重写2.6.2 函数隐藏2.6.3 函数重载 2.7 C11 final 和override 3…

我的数据库第一课:从懵懂到启迪

我的数据库第一课:从懵懂到启迪 前言 在数字化浪潮席卷全球的今天,数据库作为IT技术的“活化石”,已经成为不可或缺的基础设施。特别是在国内,随着经济的飞速发展和信息化建设的推进,数据库技术也经历了从无到有、从…

3GPP协议入门——物理层基础(一)

1. 频段/带宽 NR指定了两个频率范围,FR1:通常称Sub 6GHz,也称低频5G;FR2:通常称毫米波(Millimeter Wave),也称高频5G。 2. 子载波间隔 NR中有15kHz,30kHz,6…

【图像检索】基于颜色模型的图像内容检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于颜色模型的图像内容检索,用matlab实现。 一、案例背景和算法介绍 这…

Qt 模型视图(一):概述

文章目录 Qt 模型视图(一):概述1、模型/视图结构基本原理2、模型3、视图4、代理5、简单实例 Qt 模型视图(一):概述 ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动…