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

系列文章目录

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

前言

今天给大家介绍另一种设计模式--观察者模式,有了解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{
    @Override
    public void update() {
        System.out.println("顾客A的快递已送达");
    }
}

public class CustomerB extends Customer{
    @Override
    public 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<>();
    }
    //添加顾客
    @Override
    public void registerCustomer(Customer o) {
        customerList.add(o);
    }
    //删除顾客
    @Override
    public void removeCustomer(Customer o) {
        customerList.remove(o);
    }
    //通知所有顾客
    @Override
    public 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();
    }

总结

优点

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

缺点

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《视觉十四讲》例程运行记录(3)——运行ch6的例程中Ceres和g2o库的安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、安装Ceres1. 安装依赖2. 编译安装 二、安装g2o1. 安装依赖项2. 编译安装3. 可能出现的报错(1) 报错一 一、安装Ceres 1. 安装依赖 终端输入&#xff1a; sud…

21 使用Hadoop Java API读取序列化文件

在上一个实验中我们筛选了竞赛网站日志数据中2021/1和2021/2的数据以序列化的形式写到了hdfs上。 接下来我们使用Java API 读取序列化的数据保存到磁盘中。 其他命令操作请参考&#xff1a;16 Java API操作HDFS-CSDN博客 1.我直接在上一个项目中test/java目录下创建com.maidu.s…

72207-80-8,Epoxide-PEG-Epoxide是一种具有两个环氧基团的线性双功能PEG(聚乙二醇)试剂

【试剂详情】 英文名称 Ep-PEG-Ep&#xff0c;Epoxide-PEG-Epoxide 中文名称 环氧基-聚乙二醇-环氧基&#xff0c;聚乙二醇二缩水甘油醚 CAS号 72207-80-8 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k…

代码训练LeetCode(17)存在重复元素

代码训练(17)LeetCode之存在重复元素 Author: Once Day Date: 2024年5月7日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全球…

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…

3D点云处理的并行化

在我们的项目中&#xff0c;我们研究了数百万级 3D 点云上的空间局部计算&#xff0c;并提出了两种主要方法&#xff0c;可以提高 GPU 的速度/吞吐量&#xff0c;同时保持最终结果的性能准确性。 通过空间局部&#xff0c;我们的意思是每个像素独立地基于其局部邻域中的点执行…

基于springboot+mybatis+vue的项目实战之(后端+前后端联调)

步骤&#xff1a; 1、项目准备&#xff1a;创建数据库&#xff08;之前已经创建则忽略&#xff09;&#xff0c;以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件&#xff0c;并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …

标准引领 | 竹云参编《面向云计算的零信任体系》行业标准正式发布!

近日&#xff0c;中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日起正式实施。 该标准汇集大…

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

四、 现行数据出境制度下的三条合规路径是什么?如何判断?

综合《网络安全法》《数据安全法》以及《个人信息保护法》这三大数据合规基本法律要求来看&#xff0c;企业开展数据出境活动时&#xff0c;应结合自身的主体类型、出境数据类型和数量&#xff0c;综合判断是否须要额外&#xff08;1&#xff09;申报并通过数据出境安全评估&am…

欧洲央行管委内格尔:通胀压力或将上升,未来利率水平可能保持相对高位

欧洲央行管委约阿希姆内格尔在本周二的一次讲话中表示&#xff0c;欧洲央行可能面临一系列潜在因素导致的通胀压力加大的情况。他指出&#xff0c;人口趋势可能导致持续较高的工资增长&#xff0c;并强调通胀率可能不会回到疫情前的低迷状态。 内格尔指出&#xff0c;考虑到全…

如何看待2024数维杯?

一、赛事介绍 美赛结束后,2024年又一场高含金量数模竞赛开始报名啦!数维杯每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),累计参赛高校千余所,参赛人数超14万人,经过八年多的发展,已成为继数学建模国赛和美赛之后的第三大全国性数学建模赛事,…

通义千问免费新功能:EMO,让照片和视频“活”起来

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

Git克隆仓库报错:HTTP/2 stream 1 was not closed

报错及原因 fatal: unable to access ‘https://github.com/xxx/’: HTTP/2 stream 1 was not closed cleanly before end of the underlying stream http/2 和 http/1.1之间有个区别是“HTTP2 基于 SPDY&#xff0c;专注于性能&#xff0c;最大的一个目标是在用户和网站间只…

国际数字影像产业园专场招聘会暨四川城市职业学院双选会成功举办

为了进一步强化校企合作&#xff0c;链接企业与高素质人才&#xff0c;促进毕业生实现高质量就业&#xff0c;2024年5月7日&#xff0c;“成就梦想 职通未来”国际数字影像产业园专场招聘会暨四川城市职业学院2024届毕业生校园双选会成功举行。 当天&#xff0c;国际数字影像产…

【建网护网三十载】 守护不息创新不止,C3安全AI未来!

30年&#xff0c;中国互联网从起步探索到领先全球。1994年4月20日&#xff0c;中国正式开通首条64K的国际专线&#xff0c;标志着我国成功实现与国际互联网的全功能接轨&#xff0c;展开互联网快速发展的三十载。 回望30年&#xff0c;亲历建网&#xff0c;投身建设&#xff0c…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…

RAG系统进阶

文本分割的粒度 缺陷 粒度太大可能导致检索不精准&#xff0c;粒度太小可能导致信息不全面问题的答案可能跨越两个片段 改进: 按一定粒度&#xff0c;部分重叠式的切割文本&#xff0c;使上下文更完整 from nltk.tokenize import sent_tokenize import jsondef split_text(…

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…

大学物理实验 期末复习笔记整理(个人复习笔记/侵删/有不足之处欢迎斧正)

一、误差和数据处理 1. 系统误差是指在重复性条件下&#xff0c;对同一被测量进行无限多次测量所得结果的平均值与被测量的真值之差。它通常是由于测量设备、测量方法或测量环境等因素引起的&#xff0c;具有重复性、单向性和可测性。而随机误差则是由于测量过程中一系列有关因…