【设计模式】之观察者模式

系列文章目录

  • 【设计模式】之装饰器模式
  • 【设计模式】之工厂模式(三种)
  • 【设计模式】之工厂模式(三种)

前言

今天给大家介绍另一种设计模式--观察者模式,有了解webscoket实现原理的小伙伴应该对这个设计模式不陌生。不清楚也没关系,今天就给大家介绍一下这个设计模式。🌈


一、什么是观察者模式

观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系。在该模式中,一个目标对象管理所有依赖于它的观察者对象,并在其状态改变时主动发出通知。

在观察者模式中,主要有以下几个角色:

  1. Subject(目标/主题/可观察者)
  • 定义了被观察者需要实现的接口,通常包含添加、删除观察者以及通知所有观察者的方法。
  • 用来保存注册的观察者对象,它可以是一个具体的被观察对象,也可以是一个抽象类或接口。
  • 当其内部状态改变时,会通过某种方式(如调用方法)通知所有注册的观察者对象。
  1. Observer(观察者/监听者)
  • 定义了一个更新接口,使得在得到目标的改变通知时更新自己。
  • 可以是具体的观察者对象,也可以是一个抽象类或接口。
  • 实现了观察者接口的对象可以在目标对象改变时收到通知。
  1. ConcreteSubject(具体目标/具体可观察者)
  • 实现了目标接口,在内部状态改变时,会通知所有注册的观察者对象。
  • 通常包含有经常发生改变的数据。
  1. ConcreteObserver(具体观察者/具体监听者)
  • 实现了观察者接口,实现具体的更新方法,以便在得到目标的改变通知时执行具体的动作。
  • 根据需要,可以更新目标的状态或做某些动作。

UMl类图

二、有哪些应用场景

最常见的就是前后端实时通信的webscoket,观察者模式在其他实际应用中也具有广泛的应用场景,比如:

  1. 事件处理:观察者模式常被用于事件处理机制,其中观察者对象订阅特定事件,并在事件发生时接收通知并执行相应的操作。例如,在图形用户界面(GUI)框架中,按钮的点击事件、窗口的打开和关闭事件等都可以使用观察者模式进行处理。
  2. 消息通知:观察者模式在消息通知系统中得到广泛应用。当发布者发布新消息时,订阅该消息的观察者将收到通知并进行相应的处理。这种模式常见于聊天应用、社交媒体平台等需要实时消息传递的场景。
  3. 实时数据更新:在需要实时更新数据的应用中,观察者模式可以用于将数据源与数据消费者连接起来。当数据源的数据发生变化时,观察者可以自动获取最新的数据并进行处理。
  4. 股票市场:股票市场应用程序可以使用观察者模式来监测股票价格变化,并将这些变化通知给投资者。
  5. 游戏开发:在游戏中,观察者模式可用于处理各种事件,如玩家输入、碰撞检测、角色状态变化等。当游戏角色的位置发生变化时,所有观察者(例如地图)都能收到通知,从而更新图形显示。
  6. 网络通信:在网络应用中,观察者模式可用于实现即时通信系统,其中用户之间的消息传递可以通过观察者模式来实现。

三、案例

我就以取快递这个案例为例,首先驿站拿到我们的快递后会给我们发送取件码,通知我们取件,然后我们接收到通知后,拿着取件码取件;这个过程中,驿站就是被观察者,我们自己就是观察者。接下来我们用代码实现这个过程。

首先,定义观察者接口或者抽象类

public abstract class Customer {public abstract void update();
}

具体观察者

public class CustomerA extends Customer{@Overridepublic void update() {System.out.println("顾客A的快递已送达");}
}public class CustomerB extends Customer{@Overridepublic void update() {System.out.println("顾客B的快递已送达");}
}

 定义主题或目标接口

public interface Subject {void registerCustomer(Customer o);void removeCustomer(Customer o);void notifyCustomers();
}

 具体观察者

public class PostStation implements Subject{private List<Customer> customerList ;public PostStation(){this.customerList = new ArrayList<>();}//添加顾客@Overridepublic void registerCustomer(Customer o) {customerList.add(o);}//删除顾客@Overridepublic void removeCustomer(Customer o) {customerList.remove(o);}//通知所有顾客@Overridepublic void notifyCustomers() {for (Customer customer : customerList){customer.update();}}//对外提供取快递方法public void PostExpress(){this.notifyCustomers();}
}

测试

 void test1(){//创建一个驿站PostStation postStation = new PostStation();Customer customerA = new CustomerA();Customer customerB = new CustomerB();//添加两位顾客postStation.registerCustomer(customerA);postStation.registerCustomer(customerB);//通知所以顾客取快递postStation.notifyCustomers();}

总结

优点

  •  降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  • 目标与观察者之间建立了一套触发机制,使得当目标状态改变时,可以自动通知所有观察者。
  • 支持广播通信,目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。
  • 满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,增加新的观察目标也很方便。

缺点

  • 观察者对象很多时,通知的发布会花费很长时间,影响程序的效率
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化

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

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

相关文章

微服务核心01-Maven【项目管理工具】基础

一、Maven 简介 1.1 传统项目管理&#xff1a; 1.2 Maven 的作用 项目构建&#xff1a;提供标准的、跨平台的自动化项目构建方式。依赖管理&#xff1a;管理项目依赖的资源&#xff08;jar 包&#xff09;&#xff0c;避免资源间的版本冲突问题统一开发结构&#xff1a;提供标…

web前端笔记8

8. Less的使用 Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。Less 是一门CSS预处理语言,它扩充了CSS语言,增加了诸如变量、混合(mixin)、函数等功能,让CSS更易维护、方便制作主题、扩充。Less可以运行在Node.js或浏览器端。LESS由Alexis Sellier于…

Web LLM 攻击实验:利用 LLM API 实现 SQL 注入

前言 Web LLM 攻击 各组织都在急于集成大型语言模型 (LLM)&#xff0c;以改善其在线客户体验。这使他们面临 Web LLM 攻击&#xff0c;这些攻击利用模型对攻击者无法直接访问的数据、API 或用户信息的访问权限。例如&#xff0c;攻击可能&#xff1a; 检索 LLM 有权访问的数…

【valse 2024】会议内容汇总(持续更新)

系列文章目录 提示&#xff1a;更新中&#xff0c;一周左右更新完毕。需要具体课件的可私信 文章目录 系列文章目录开幕式主旨报告-1:大模型时代的机遇和挑战主旨报告-2:以深度学习框架为牵引促进自主 AI生态发展主旨报告-3:从洞穴的影子到智能的光辉--连接和交互方式的改变塑造…

el-table-column表格匹配字典数据

根据字典值匹配 列的值 优点就是可维护性强 改完字典就会生效 如果写死需求变更难以维护 <el-table v-loading"loading" :data"processList" selection-change"handleSelectionChange"><el-table-column type"selection" wid…

别出心裁的自动化网页数据采集:Chrome插件和mitmproxy

别出心裁的自动化网页数据采集&#xff1a;Chrome插件和mitmproxy 前言 在信息时代&#xff0c;数据已成为决策的关键。传统的数据采集方法往往依赖于手动操作或简单的自动化脚本&#xff0c;这限制了数据的时效性和精确性。为了克服这些限制&#xff0c;本文介绍了一种结合C…

文件批量移动:按路径名称指引,高效文件管理与批量归类实战

在数字化时代&#xff0c;文件批量移动成为了一项至关重要的技能&#xff0c;它能够帮助我们高效地管理和归类大量的文件。通过按路径名称指引进行文件批量移动&#xff0c;我们可以使文件组织更加有序&#xff0c;提高文件检索的速度&#xff0c;从而提升工作效率。 一、明确路…

Linux: 高CPU使用率的一种情况:内存不够用

文章目录 问题swapd的作用原因是问题 有一台jenkins服务器,在安装完成之后,一开始ssh访问还可以,后续再访问,就出现严重的变慢现象。 从下面的的top命令,可以看到,CPU的使用率几乎全被system使用,而idle的就是0。 从列表里看,kswapd0占用的最多,达到了47.5%。而且可以…

多线程学习Day09

10.Tomcat线程池 LimitLatch 用来限流&#xff0c;可以控制最大连接个数&#xff0c;类似 J.U.C 中的 Semaphore 后面再讲 Acceptor 只负责【接收新的 socket 连接】 Poller 只负责监听 socket channel 是否有【可读的 I/O 事件】 一旦可读&#xff0c;封装一个任务对象&#x…

【建议收藏】CSP-J/S信奥赛,小白报名教程!

✅ 信奥介绍 信息学奥赛是五大学科&#xff08;数学、物理、化学、生物、信息学&#xff09;奥林匹克竞赛中唯一一个可以贯穿小学、初中、高中的特长生项目。由中国计算机学会主办&#xff0c;主要考察信息学&#xff0c;即编程的相关知识和能力。 ✅ 报名流程 &#x1f449;登…

智能绘画系统源码系统 后台自由设置会员套餐 带网站的安装包以及安装部署教程

在当今数字化与智能化快速发展的时代&#xff0c;艺术与技术正以前所未有的速度相互融合。为了满足广大绘画爱好者和专业艺术家的需求&#xff0c;我们精心打造了一款智能绘画系统源码系统。该系统不仅具备高度的智能化特性&#xff0c;还提供了丰富的后台管理功能&#xff0c;…

JS中递归是什么原理

JavaScript中的递归&#xff08;Recursion&#xff09;是一种编程技巧&#xff0c;它允许函数直接或间接地调用自身。递归函数在解决一些问题时特别有用&#xff0c;特别是那些可以分解为更小、相似子问题的问题。递归的基本原理包括两个关键部分&#xff1a; 1&#xff0c;基…

CTF-密码学基础

概述 密码学(Cryptolopy)&#xff1a;是研究信息系统安全保密的科学 密码学研究的两个方向&#xff1a; 密码编码学(Cryptography)&#xff1a;主要研究对信息进行编码&#xff0c;实现对信息的隐蔽密码分析学(Cryptanalytics)&#xff1a;主要研究加密信息的破译或消息的伪造…

多客陪玩系统源码APP小程序H5陪玩开发伴游源码游戏陪玩平台源码陪玩平台开发约单源码线下陪玩接单平台app小程序H5源码游戏陪玩app小程序H5开发

出售成品陪玩app小程序H5源码&#xff0c;免费搭建部署和售后服务&#xff0c;并提供源码二开、定制开发等相关服务。 一、陪玩app源码的功能介绍 1、语音聊天: 陪玩app小程序H5源码用户随时创建语音聊天室&#xff0c;实现多用户上麦功能&#xff0c;提高互动聊天体验。 2、游…

【Qt 开发基础体系】字符串类应用和常用的数据类型

文章目录 1. Qt 字符串类应用1.1 操作字符串1.2 QString::append()函数1.3 QString::sprintf()函数1.4 QString::arg()函数 2. 查询字符串2.1 函数 QString::startsWith()2.2 函数 QString::contains()2.3 函数 QString::toInt()2.4 函数 QString::compare()2.5 将 QString 转换…

攻克《模版进阶》 全方位了解

目录 前言&#xff1a; 非类型模板参数 按需实例化 模板的特化 概念&#xff1a; 函数模板特化&#xff1a; 类模板特化&#xff1a; 1、全特化 2、偏特化 3、类模板特化应用示例 模板分离编译 什么是分离编译 模板的分离编译 解决方法 总结 前言&#xff1a; 我…

PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写 PostgreSQL 查询计划openGauss 查询计划拓展对比 看腻了文章就来听听视频讲解吧&#xff1a;https://www.bilibili.com/video/BV1oH4y137P7/ 数据库类型数据库版本PostgreSQL16.2openGauss6.0 创建测试表…

Python语言基础与由来介绍【自我维护版】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客是在已有的博客的基础上进行的维护。 主要…

MySQL中所有数据类型

MySQL支持多种数据类型&#xff0c;以下是MySQL中所有的数据类型及其简要解释&#xff1a; 数值型数据类型&#xff1a; INT&#xff1a;整数类型&#xff0c;用于存储整数值。TINYINT&#xff1a;小整数类型&#xff0c;用于存储小范围整数值。SMALLINT&#xff1a;小整数类型…

Delphi 解决字符串型的枚举值设置和读取的方法

需求&#xff1a; 对于枚举类型字段&#xff0c;一般数据库中存储的是整型值&#xff0c;但在业务处理中使用整型值可读性不强&#xff0c;且显示对应中文描述不方便。 例如订单状态的枚举值为&#xff1a;0:未支付 1:支付中 2:已支付 3:已退款&#xff0c;现在有一个…