Java实现观察者模式
一、前言
观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。
二、具体实现
1、发布订阅案例
观察者接口:
/*** @Description: 观察者接口* @Date: 2024-12-27 10:08* @Author: gaoyufei**/
public interface Observer {void accept(String message);
}
观察者实现:
/*** @Description: 订阅者* @Date: 2024-12-27 10:10* @Author: gaoyufei**/
public class Subscriber implements Observer{public String clientId;public Subscriber(String clientId){this.clientId=clientId;}@Overridepublic void accept(String message) {System.out.println("订阅者:"+clientId+" 接受到消息:"+message);}
}
主题接口:
/*** @Description: 主题接口* @Date: 2024-12-27 10:15* @Author: gaoyufei**/
public interface Subject {void add(Observer observer);void del(Observer observer);void notify(String message);
}
主题实现:
import java.util.ArrayList;
import java.util.List;/*** @Description: 主题,维护了订阅者列表,通知订阅者* @Date: 2024-12-27 10:16* @Author: gaoyufei**/
public class Topic implements Subject {private List<Observer> observerList=new ArrayList<>();@Overridepublic void add(Observer observer) {observerList.add(observer);}@Overridepublic void del(Observer observer) {observerList.remove(observer);}@Overridepublic void notify(String message) {observerList.stream().forEach(e->{e.accept(message);});}
}
模拟订阅者订阅主题,客户端发布消息:
/*** @Description: 模拟订阅者订阅主题,客户端发布消息* @Date: 2024-12-27 10:18* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {Topic topic=new Topic();Subscriber subscriber1=new Subscriber("001");Subscriber subscriber2=new Subscriber("002");Subscriber subscriber3=new Subscriber("003");topic.add(subscriber1);topic.add(subscriber2);topic.add(subscriber3);topic.notify("您有一条新消息!");}
}
2、村长通知村民案例
观察者接口:
/*** @Description: 观察者接口* @Date: 2024-12-27 9:35* @Author: gaoyufei**/
public interface Observer {void accept(String message);
}
观察者具体观察者村民:
/*** @Description: 具体观察者,村民,能接受消息* @Date: 2024-12-27 9:37* @Author: gaoyufei**/
public class Resident implements Observer{private String name;public Resident(String name){this.name=name;}@Overridepublic void accept(String message) {System.out.println("村民:"+this.name+" 收到信息:"+message);}
}
抽象主题:
/*** @Description: 抽象主题* @Date: 2024-12-27 9:39* @Author: gaoyufei**/
public interface Subject {void add(Observer observer);void del(Observer observer);void notify(String message);
}
主题的具体实现,村长的记录本:
import java.util.ArrayList;
import java.util.List;
/*** @Description: 主题的具体实现,村长的记录本,维护了村民信息,村长可以通过记录本给村民群发信息* @Date: 2024-12-27 9:42* @Author: gaoyufei**/
public class RecordBook implements Subject {private List<Observer> observerList = new ArrayList<>();@Overridepublic void add(Observer observer) {observerList.add(observer);}@Overridepublic void del(Observer observer) {observerList.remove(observer);}@Overridepublic void notify(String message) {observerList.stream().forEach(e -> {e.accept(message);});}
}
村长登记村民信息,用记录本给村民群发信息:
/*** @Description: 村长登记村民信息,用记录本给村民群发信息* @Date: 2024-12-27 9:44* @Author: gaoyufei**/
public class VillageHead {public static void main(String[] args) {
// 1、村里,村长有一个记录村民电话的本子,村民都需要登记一下。
// 在村里有什么事情的时候,村长就通过群发消息的方式通知村民。
// 2、村民就是观察者、订阅者,村长发布信息,记录本就是主题,RecordBook recordBook=new RecordBook();Resident resident=new Resident("王满银");Resident resident1=new Resident("孙玉亭");Resident resident2=new Resident("孙玉厚");recordBook.add(resident);recordBook.add(resident1);recordBook.add(resident2);recordBook.notify("大家好,今天下午三点来村支部开会,有重要事情通知!");}
}
相关文章:
Java实现观察者模式
一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...
通过百度api处理交通数据
通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...

探索CSDN博客数据:使用Python爬虫技术
探索CSDN博客数据:使用Python爬虫技术 在数字化的浪潮中,数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台,汇聚了海量的技术博客与文章,成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…...

b站ip属地评论和主页不一样怎么回事
在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…...
如何查看服务器内存占用情况?
如何查看服务器的内存占用情况?你知道内存使用情况对服务器性能的重要性吗?内存是服务器运行的核心资源之一,了解内存的占用情况可以帮助你优化系统性能。 要查看服务器的内存占用情况,首先需要确定你使用的是哪种操作系统。不同…...
流架构的读书笔记(2)
流架构的读书笔记(2) 一、建模工具之一沃德利地图 推测技术的发展,交流和辩论思想的最有力的方法是沃德利地图 沃德利地图的制作步骤 1确定范围和用户需求 2确定满足用户需求所需的组件 3在一条范围从全新到被人们接受的演进轴上评估这些组成 部分的演…...

E6 中的 扩展运算符(Spread) 和 剩余运算符(Rest)
时间:2024.12.29 之前看到 Es6 中的 三点运算符,有如下的几种写法,有时候三点运算符放在左边,有时候三点运算符放在右边,老是混淆。今天记录下,加强理解。 先看一个问题 最近在看 《ECMAScript 6 入门》关于…...

Python的简单爬虫框架
爬虫为网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、…...

使用 uni-app 开发的微信小程序中,如何在从 B 页面回来时,重新拉取数据?
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…...

Windows API Set:那些“只存在但不被使用“的DLL
API Set 是什么? 想象一下,Windows就像一个大型图书馆,而API Set就是这个图书馆的索引系统。但这个索引系统非常特别:它是直接内置在Windows加载器中的"虚拟目录"。 // 一个典型的API Set映射示例 api-ms-win-core-mem…...

黑神话悟空鼠标光标分享
效果图: 鼠标光标特点 这套鼠标光标的设计灵感来源于《黑神话:悟空》游戏中的角色和元素,具有以下特点: • 主题鲜明:光标设计紧扣游戏主题,采用了游戏中的元素,让玩家在使用电脑时也能感受到…...
编写一个简单的引导加载程序(bootloader)
编写一个简单的引导加载程序(bootloader)通常用于嵌入式系统或自定义操作系统。这里,我将为你提供一个基于x86架构的简单汇编语言 bootloader 示例。这个 bootloader 将会在启动时打印一条消息到屏幕上。 使用 NASM 汇编器来编写这个 bootlo…...

【Linux基础】进程(上) —— 概念、状态、优先级与环境变量
目录 一、进程的概念 1. 什么是进程 PCB进程控制块的理解 2. 查看进程的方式 ps ajx 指令 getpid系统调用 3. 另外一种查看进程的方式(了解) 4. 进程的常见调用 fork 创建子进程 现象说明 二、进程的状态 1. 操作系统层面的进程状态 ① 运行状态 ② 阻塞状态 ③…...
Rust: enum 和 i32 的区别和互换
在Rust编程语言中,enum(枚举)和i32是两种不同类型的数据结构,它们各自有不同的用途和特性。 i32 i32是一个32位的有符号整数类型。它用于存储整数值,范围从-2,147,483,648到2,147,483,647。i32是Rust中的基本数据类型…...
2024年终回顾
前言 很久没有更新博客,因为工作内容主要是内场开发,后来有点和互联网脱轨,断断续续上来看一下。这个总结应该也很简单,涉及以下的几个内容进行逐一说明 一、就业问题 这个问题可能很尖锐,从大环境来说,去…...

RGB、HSV颜色模型及MATLAB互换应用实例
一、前言 RGB和HSV模型是数字图像处理中颜色空间中的两种重要表示方式,RGB和HSV都是描述颜色的数学模型,可以用于表示和处理图像中的颜色信息。 RGB模型是一种基于光的颜色模型,由红(Red)、绿(Green&#x…...
# 【超全面了解鸿蒙生命周期】-生命周期补充
【超全面了解鸿蒙生命周期】-生命周期补充 鸿蒙所有的生命周期函数梳理 文章目录 【超全面了解鸿蒙生命周期】-生命周期补充前言一、AbilityStage的生命周期二、ExtensionAbility卡片生命周期三、Web组件常用生命周期 前言 本文是继之前写的生命周期函数梳理的进一步补充&…...

黑神话悟空游戏鼠标光标使用教程与下载
效果图: 鼠标光标特点 这套鼠标光标的设计灵感来源于《黑神话:悟空》游戏中的角色和元素,具有以下特点: • 主题鲜明:光标设计紧扣游戏主题,采用了游戏中的元素,让玩家在使用电脑时也能感受到…...
【机器学习】梯度下降
文章目录 1. 梯度下降概念2. 梯度下降的技巧2.1 动态设置学习率2.2 Adagrad调整梯度2.3 随机梯度下降(SGD)2.4 特征缩放 3. 梯度下降理论基础 1. 梯度下降概念 梯度:Loss 对参数在某一点的偏微分,函数沿梯度的方向具有最大的变化…...
【leetcode 07】707.设计链表
要点⭐ 链表的常见操作 获取第n个节点的值 头部插入节点 尾部插入节点 第n个节点前插入(先立新,在破旧) 删除第n个节点 class ListNode{int val;ListNode next;ListNode(){};ListNode(int val){this.valval;} } class MyLinkedList {//链表大…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...