设计模式——观察者模式17

观察者模式指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。
中介者模式是N对N的双向关系。观察者模式是1对N的单向关系。
设计模式,一定要敲代码理解
在这里插入图片描述

发布者抽象(主题)

/*** @author ggbond* @date 2024年04月15日 10:04*/
public  interface Theme {// 添加观察者(订阅者)public void attach(Subscribe s);// 删除观察者(订阅者)public void detach(Subscribe s);// 通知所有观察者(订阅者)public void notifySubscriber();
}

发布者实现

/*** @author ggbond* @date 2024年04月15日 10:06*/
public class Publisher implements Theme{private List<Subscribe> list=new ArrayList<>();@Overridepublic void attach(Subscribe s) {list.add(s);}@Overridepublic void detach(Subscribe s) {list.remove(s);}//通知所有订阅者@Overridepublic void notifySubscriber() {System.out.println("@全体人员,今晚有个party,地点在望子成龙小学");for (Subscribe o : list) {o.getinfo();}}
}

订阅者抽象

public interface Subscribe {void getinfo();
}

订阅者实现

/*** @author ggbond* @date 2024年04月15日 10:11*/
public class Subscriber implements Subscribe{private String name;public Subscriber(String name) {this.name = name;}public String getName() {return name;}@Overridepublic void getinfo() {System.out.println(name+":收到最新信息");}
}

测试与结果

/*** @author ggbond* @date 2024年04月15日 10:14*/
public class Main {public static void main(String[] args) {//发布者Publisher publisher=new Publisher();//订阅者Subscribe s1=new Subscriber("ggbond1");Subscribe s2=new Subscriber("ggbond2");Subscribe s3=new Subscriber("ggbond3");//订阅者订阅主题publisher.attach(s1);publisher.attach(s2);publisher.attach(s3);//通知publisher.notifySubscriber();}
}
@全体人员,今晚有个party,地点在望子成龙小学
ggbond1:收到最新信息
ggbond2:收到最新信息
ggbond3:收到最新信息

总结

关系为1对N,对满足开闭原则。 无需修改发布者代码就能引入新的订阅者类

代码下载

代码下载

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

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

相关文章

电机驱动-理论学习-Fast计算

Fast计算 cordic方法原理详解代码实现 德州仪器IQmath算法讲解代码实现 欧洲黑客大会FastMath实现原理代码实现 电机运算通常在有限资源MCU上进行计算&#xff0c;对实时性有极高要求。然而&#xff0c;电机驱动又有大量的计算。所以&#xff0c;对运算速度也有较为严格要求。所…

腾讯EdgeOne产品测评体验—金字塔般的网络安全守护神

作为一名对网络安全和性能优化充满热情的用户&#xff0c;我决定体验腾讯云下一代 CDN 服务 - EdgeOne。这款引以为傲的全方位服务如数来到&#xff0c;从域名解析、动静态智能加速到四层加速及DDoS/CC/Web/Bot 防护&#xff0c;一应俱全。随着时代风云变幻&#xff0c;日均数千…

SpringCloud整合ElasticSearch搜索使用

环境说明 ORM&#xff1a;easy-es 2.0.0(opens new window) ElasticSearch&#xff1a;7.14.0 pigx&#xff1a;5.2 请保持环境如上&#xff0c;ElasticSearch 兼容性较差无法保证其他版本正常整合执行。快速开始 ① 安装 ElasticSearch docker run --name es714 -p 9200:920…

高级数据结构与算法习题(7)

一、单选题 1、When solving a problem with input size N by divide and conquer, if at each stage the problem is divided into 8 sub-problems of equal size N/3, and the conquer step takes O(N2logN) to form the solution from the sub-solutions, then the overall…

Linux调试器之gdb

前言 我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢&#xff1f;我们并未介绍&#xff0c;本期我们将来介绍最后一个工具 --- 调试器gdb。 本期内…

云原生周刊:CNCF 2023 年度调查报告 | 2024.4.15

开源项目推荐 highlight 该项目是一个开源全栈监控平台。其功能包括错误监控、会话重放、日志记录、分布式跟踪等。 Helm Compose Helm Compose 是一个 helm 插件&#xff0c;用于在单个配置文件中管理一个或多个图表的多个版本。 HAMi 异构 AI 计算虚拟化中间件&#xf…

HttpComponentsClientHttpRequestFactory

HttpComponentsClientHttpRequestFactory 文章目录 HttpComponentsClientHttpRequestFactory介绍**配置 PoolingHttpClientConnectionManager 时&#xff0c;可以使用如下的方法来设置最大连接数&#xff1a;****defaultMaxPerRoute**示例RestTemplate的负载均衡策略是什么&…

字节面试:领域、子域、核心域、通用域和支撑域怎么划分?

领域驱动设计&#xff08;DDD&#xff09;里面有一堆专业术语&#xff0c;比如领域、子域、核心域、通用域、支撑域等等&#xff0c;听着是不是觉得挺吓人&#xff1f;别怕&#xff0c;我来带你轻松搞懂它们。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记。 《大厂…

DAY13|239. 滑动窗口最大值、347.前K个高频元素

239. 滑动窗口最大值、347.前 K 个高频元素 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 难度有些大啊… 其实队列没有必要维护窗口里的所有元素&#xff0c;只需要维护有可能成为窗口里最大值的元素就可以了&#xff0c;同时保证队列里的元素数值是由大到小…

基于U-Net的图像分割算法介绍

U-Net是一种用于图像分割的深度学习架构,其设计初衷是用于生物医学图像分割,尤其是医学影像中的细胞分割任务。U-Net结构独特,具有编码器-解码器结构,能够有效地捕捉图像中的局部和全局信息,并在像素级别上进行精确的分割。 相关论文: U-Net: Convolutional Networks for…

STM32 CAN的验收筛选器

STM32 CAN的验收筛选器 简介 CAN外设的验收筛选器&#xff0c;一共有28个筛选器组&#xff0c;每个筛选器组有2个寄存器&#xff0c; CAN1和CAN2共用的筛选器的。 在 CAN 协议中&#xff0c;消息的标识符与节点地址无关&#xff0c;但与消息内容有关。因此&#xff0c;发送节…

密码学基础 -- 走进RSA(2)(放弃数学原理版)

目录 1.概述 2. RSA测试 2.1 加解密实验 2.2 签名验签测试 3. RSA原理简介 4.小结 1.概述 从上面密码学基础 -- 走进RSA(1)(放弃数学原理版)-CSDN博客我们知道了非对称算法的密钥对使用时机&#xff0c;那么接下里我们继续讲解RSA&#xff0c;我们分别从RSA加解密、签名验…

阿里云消息队列升级全新品牌 ApsaraMQ丨阿里云云原生 3 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 阿里云 ApsaraMQ 率先完成消息队列全系 Serverles…

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法

星火大模型的主页&#xff1a;iFlytekSpark-13B: 讯飞星火开源-13B&#xff08;iFlytekSpark-13B&#xff09;拥有130亿参数&#xff0c;新一代认知大模型&#xff0c;一经发布&#xff0c;众多科研院所和高校便期待科大讯飞能够开源。 为了让大家使用的更加方便&#xff0c;科…

leetcode-链表中间节点

876. 链表的中间结点 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间…

12.MySQL应用架构演变

MySQL应用架构演变 1.总览 单机单库主从架构分库分表云数据库 2.单机单库 介绍 一个简单的小型网站或者应用背后的架构可以非常简单&#xff0c;数据存储只需要一个MySQL Instance就能满足数据读取和写入需求&#xff08;这里忽略掉了数据备份的实例&#xff09;&#xff…

[pytorch基础操作] 矩阵batch乘法大全(dot,* 和 mm,bmm,@,matmul)

逐元素相乘torch.dot* 矩阵乘法torch.mmtorch.bmm 和 torch.matmul 逐元素相乘 逐元素相乘是指对应位置上的元素相乘&#xff0c;要求张量的形状相同。 torch.dot 按位相乘torch.dot&#xff1a;计算两个张量的点积&#xff08;内积&#xff09;&#xff0c;只支持1D张量&am…

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

Linux运维面试

Linux面试题&#xff08;运维人员必备技能&#xff09; 1、现在给你三百台服务器&#xff0c;你怎么对他们进行管理&#xff1f; 管理3百台服务器的方式&#xff1a; 1&#xff09;设定跳板机&#xff0c;使用统一账号登录&#xff0c;便于安全与登录的考量。 2&#xff09;使…

【vue】购物车案例

change"fun"&#xff1a;元素值发生改变时&#xff0c;会触发事件fun <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale…