设计模式 - 行为型模式考点篇:观察者模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录

一、行为型模式

1.1、观察者模式

1.1.1、概述

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


1.1、观察者模式

1.1.1、概述

观察者模式又称为 发布 - 订阅 模式.,就是让多个观察者对象同时监听同一个主题对象.  这个主题对象在变化的同时,也会把消息推送给所有观察者对象,使他们能够更新自己.

例如微信公众号,当微信用户点击关注某一公众号,当这个公众号的内容更新后,他就会把消息推送给所有关注了当前公众号的用户.  此时微信用户就是观察者,公众号就是被观察者.

观察者模式主要有以下角色:

  • 抽象主题:所有的观察者对象都放在一个 List 集合中,每一个主题都可以有任意数量的观察者,并且提供 增加 和删除 观察者对象的接口.
  • 具体主题:实现了抽象主题接口,并在有新的消息存入主题时,就会把消息推送给 List 中所有观察者.
  • 抽象观察者:定义了一个更新接口,使得在主题更新消息时能随时通知自己.
  • 具体观察者:实现了抽象观察者.

1.1.2、案例实现

实现上述案例.

/*** 抽象主题类*/
public interface Subject {/*** 增加订阅者* @param observer*/void attach(Observer observer);/*** 删除订阅者* @param observer*/void detach(Observer observer);/*** 通知订阅者更新消息* @param message*/void notify(String message);}
/*** 抽象观察者接口*/
public interface Observer {void update(String message);}
/*** 具体主题类:微信公众号*/
public class SubjectWeChat implements Subject {//存储订阅公众号的微信用户private List<Observer> userList = new ArrayList<>();@Overridepublic void attach(org.example.behavioral_mode.observer_mode.Observer observer) {userList.add(observer);}@Overridepublic void detach(org.example.behavioral_mode.observer_mode.Observer observer) {userList.remove(observer);}@Overridepublic void notify(String message) {for (Observer observer : userList) {observer.update(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 class Client {public static void main(String[] args) {//微信公众号SubjectWeChat weChat = new SubjectWeChat();//订阅公众号weChat.attach(new User("李白"));weChat.attach(new User("杜甫"));weChat.attach(new User("辛弃疾"));//公众号更新消息,并推送给订阅的用户weChat.notify("微信公众号的诗集更新啦!");}}

执行结果如下:

1.1.3、优缺点

优点:

解耦合:降低了主题和观察者之间的耦合关系.

实现广播机制:主题发送通知,所有注册的观察者都能收到消息.

缺点:

如果观察者非常多,那么可能会有性能上的损耗.

如果主题有循环依赖的话,那么主题发送通知会使观察者循环调用,导致系统崩溃.

1.1.4、使用场景

当对象间存在 一对多 关系,一个对象的状态发生改变会影响到其他对象.

类似 发布 - 订阅模式时.

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

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

相关文章

子组件跳转父组件

描述&#xff1a;父组件Form.vue 点击关联&#xff0c;弹出子组件importForm.vue 选中一条数据之后&#xff0c;点击确定按钮&#xff0c;关闭子组件importForm.vue&#xff0c;将子组件的内容显示在父组件Form.vue中 选中第一条数据&#xff0c;点击确定 父组件对应的工作内容…

【深度学习】Chinese-CLIP 使用教程,图文检索,跨模态检索,零样本图片分类

代码&#xff1a;https://github.com/OFA-Sys/Chinese-CLIP/blob/master/deployment.md 文章目录 安装环境和onnx推理转换所有模型为onnx测试所有onnx模型的脚本onnx cpu方式执行docker镜像 安装环境和onnx推理 安装环境&#xff0c;下载权重放置到指定目录&#xff0c;进行on…

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…

相机坐标系之间的转换

一、坐标系之间的转换 一个有4个坐标系&#xff1a;图像坐标系、像素坐标系、相机坐标系、世界坐标系。 1.图像坐标系和像素坐标系之间的转换 图像坐标系和像素坐标系在同一个平面&#xff0c;利用平面坐标系之间的转换关系可以之知道两个坐标系变换的公式&#xff0c;并且该…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

关于 打开虚拟机出现“...由VMware产品创建,但该产品与此版VMwareWorkstateion不兼容,因此无法使用” 的解决方法

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133678951 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

超低延时直播技术演进之路-进化篇

一、概述 网络基础设施升级、音视频传输技术迭代、WebRTC 开源等因素&#xff0c;驱动音视频服务时延逐渐降低&#xff0c;使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展&#xff0c;并逐渐向产业互联网领域加速渗透。经历了行业第一轮的…

Spark 9:Spark 新特性

Spark 3.0 新特性 Adaptive Query Execution 自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息(元数据)和对成本的错误估算(执行计划调度)导致生成的初始执行计划不理想&#xff0c;在Spark3.x版本提供Adaptive Query Execution自适应查询技术&#xff0c;通过在”运行…

Kafka集群架构设计原理详解

从 Zookeeper 数据理解 Kafka 集群工作机制 这一部分主要是理解 Kafka 的服务端重要原理。但是 Kafka 为了保证高吞吐&#xff0c;高性能&#xff0c;高可扩展的三高架构&#xff0c;很多具体设计都是相当复杂的。如果直接跳进去学习研究&#xff0c;很快就会晕头转向。所以&am…

SpringBoot 对接 MinIO 实现文件上传下载删除

前言 MinIO 是一个开源的对象存储服务器&#xff0c;它可以存储大容量非结构化的数据&#xff0c;例如图片、音频、视频、日志文件、备份数据和容器/虚拟机镜像等。 Spring Boot 与 MinIO 的整合可以方便地实现文件的上传和下载等功能 在实际应用中&#xff0c;Spring Boot …

再获深交所认可,Smartbi实力领跑金融BI赛道

“十四五”规划中提到&#xff0c;健全具有高度适应性、竞争力、普惠性的现代金融体系&#xff0c;构建有效支撑实体经济的体制机制。《证券期货业科技发展“十四五”规划》作为指导证券期货业科技发展的纲领性文件&#xff0c; 秉承国家“十四五”规划的数字化发展理念&#x…