java设计模式-观察者模式(jdk内置)
上一篇我们学习了 观察者模式。
观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。
下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。
/*** 被观察者具体实现, 实现jdk自带的类** @author jiangkd* @date 2023/7/28 10:32:03*/
@Component
public class WeChatMessage extends Observable {private String message;/*** 模拟被观察者的主题更新, 通知所有观察者** @param message 主题更新*/public void updateMessage(String message) {this.message = message;// 通知所有观察者this.setChanged();this.notifyObservers(message);}}
两个观察者
/*** 具体的观察者1** @author jiangkd* @date 2023/7/28 10:07:34*/
@Slf4j
@Component
public class User1 implements Observer {/*** 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已** @param o 主题, 被观察者主题类型* @param arg 接受到的消息*/@Overridepublic void update(Observable o, Object arg) {if (o instanceof WeChatMessage) {log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));}}
}
/*** 具体的观察者2** @author jiangkd* @date 2023/7/28 10:09:22*/
@Slf4j
@Component
public class User2 implements Observer {/*** 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已** @param o 主题, 被观察者主题类型* @param arg 接受到的消息*/@Overridepublic void update(Observable o, Object arg) {if (o instanceof WeChatMessage) {log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));}}}
测试:
/*** @author jiangkd* @date 2023/7/28 10:37:36*/
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {@ResourceWeChatMessage weChatMessage;@ResourceUser1 user1;@ResourceUser2 user2;@Testpublic void test(){// 依然绑定被观察者和观察者weChatMessage.addObserver(user1);weChatMessage.addObserver(user2);weChatMessage.updateMessage("测试一下1!!");}}
执行结果记录日志:
2023-07-28 10:47:30.713 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:测试一下1!!
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:测试一下1!!
然后测试注销其中一个观察者User1
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {@ResourceWeChatMessage weChatMessage;@ResourceUser1 user1;@ResourceUser2 user2;@Testpublic void tes2(){// 依然绑定被观察者和观察者weChatMessage.addObserver(user1);weChatMessage.addObserver(user2);weChatMessage.updateMessage("在干什么");log.info("========================================");weChatMessage.deleteObserver(user1);weChatMessage.updateMessage("你过来一下");}}
执行结果记录日志:
2023-07-28 10:48:38.946 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.947 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.d.gczms.JdkObserverTest : ========================================
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:你过来一下
相关文章:
java设计模式-观察者模式(jdk内置)
上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码&am…...
秒级体验本地调试远程 k8s 中的服务
点击上方蓝色字体,选择“设为星标” 回复”云原生“获取基础架构实践 背景 在这个以k8s为云os的时代,程序员在日常的开发过程中,肯定会遇到各种问题,比如:本地开发完,需要部署到远程k8s集群,本地…...
CV前沿方向:Visual Prompting 视觉提示工程下的范式
prompt在视觉领域,也越来越重要,在图像生成,作为一种可控条件,增进交互和可控性,在多模态理解方面,指令prompt也使得任务灵活通用。视觉提示工程,已然成为CV一个前沿方向! 下面来看看…...
Redis五大基础类型解析
1.String类型 特征:即存储字符串的类型,单个字符串存储量最大不超过512MB 常用业务场景:⽤来存储JSON序列化之后对象 底层编码: int编码 数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而…...
在CSDN学Golang云原生(服务网格istio)
一,在Kubernetes上部署istio 在Kubernetes上部署istio,可以按照以下步骤进行: 安装Istio 使用以下命令从Istio官网下载最新版本的Istio: curl -L https://istio.io/downloadIstio | ISTIO_VERSION<VERSION> sh - 其中&…...
Golang 获取本地 IP 地址方法
在 Golang 中,使用 net 包可以很方便地获取到本机IP地址。 借助 net.InterfaceAddrs 方法 简单示例代码如下: package mainimport ("fmt""net" )func main() {addrList, err : net.InterfaceAddrs()if err ! nil {panic(err)}for…...
抖音seo短视频账号矩阵系统技术开发简述
说明:本开发文档适用于抖音seo源码开发,抖音矩阵系统开发,短视频seo源码开发,短视频矩阵系统源码开发 一、 抖音seo短视频矩阵系统开发包括 抖音seo短视频账号矩阵系统的技术开发主要包括以下几个方面: 1.前端界面设…...
运维高级--shell脚本完成分库分表
为什么要进行分库分表 随着系统的运行,存储的数据量会越来越大,系统的访问的压力也会随之增大,如果一个库中的表数据超过了一定的数量,比如说MySQL中的表数据达到千万级别,就需要考虑进行分库分表; 其…...
Mysql 忘记密码怎么重置密码(详细步骤)
每种方法都有其适用的情况,根据具体情况选择合适的方法。无论选择哪种方法,请务必在重置密码后及时删除临时用户并重新启动 MySQL 服务。 一、使用 mysqladmin 重置密码 停止服务 # systemctl 启动的使用这个停止 $ sudo systemctl stop mysql# mac 本机…...
机器学习深度学习——图像分类数据集
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——softmax回归(下) 📚订阅专栏:机器学习&&深度学习…...
【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2
第一道栈迁移题目,跌跌撞撞理解了 前言 当前溢出可用空间比较少时(极端情况下仅能覆写ebp和ret),可以通过栈迁移的方式,扩大shellcode的容纳空间,其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋…...
网络编程(13): 网络通信常用命令(后续待补充)
ifconfig 一般用于查看网卡信息 ping 一般用于侦测本机到目标网络主机的网络是否通常: ping ip/域名 telnet 可以用于指定ip地址和端口的侦听服务是否存在:telnet ip port, 也可以模拟客户端给服务器发数据 netstat 用于查看网络连接状态 -a: 显示所有选项 -t&#…...
flask创建数据库连接池
flask创建数据库连接池 在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…...
C语言手撕顺序表
目录 一、概念 1、静态顺序表:使用定长数组存储元素。 2、动态顺序表:使用动态开辟的数组存储 二、接口实现 1、对顺序表的初始化 2、对数据的销毁 3、对数据的打印 4、检查是否需要扩容 5、尾插 6、头插 7、尾删 8、头删 9、在pos位置插入x …...
常见的排序算法
常见的排序算法 常见的排序算法包括: 冒泡排序(Bubble Sort):依次比较相邻的元素,将较大的元素交换到右侧,逐步将最大元素移动到末尾。插入排序(Insertion Sort):将数组…...
C#如何使用SQLite数据库?
文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库,它的库文件非常小巧,不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用ÿ…...
如何将表格中的状态数据转换为Tag标签显示
考虑到系统前端页面的美观程度,通常通过Tag标签来代替某条数据中的状态信息。仅通过一点操作,便能够使得页面美观程度得到较大提升,前后对比如下所示。代码基于Vue以及Element-ui组件实现。 修改前: 修改后: 修改前…...
centos中修改防火墙端口开放配置
1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 (1)添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT (2)添加需要开放的某个网段端口 4001:4020 …...
程序设计 算法基础
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
Spine骨骼动画集成:Unity 2D游戏性能优化实战指南
1. 为什么Spine不是“另一个动画插件”,而是2D游戏性能分水岭在Unity里做2D游戏,很多人卡在同一个地方:角色动起来很卡,美术给的PSD切图动效一多就掉帧,UI动画和角色动画抢资源,打包后APK体积暴涨——你试过…...
别再只用Graphics2D了!5个Java图片缩放方案实战评测:从Thumbnailator到OpenCV,谁画质最好?
别再只用Graphics2D了!5个Java图片缩放方案实战评测:从Thumbnailator到OpenCV,谁画质最好? 当你在Java项目中需要处理用户上传的图片时,是否也遇到过这样的困扰:用Graphics2D简单缩放后,图片变得…...
锂电池健康评估:避开NASA/Oxford数据IC分析中的三个常见坑(滤波、异常值、容量增生)
锂电池健康评估实战:破解NASA/Oxford数据集IC分析的三重困局 当你在深夜盯着屏幕上那些扭曲的IC曲线时,是否也经历过这样的崩溃时刻?明明按照教科书步骤处理NASA数据集,得到的却是锯齿状的噪声图形;或是发现Oxford数据…...
麒麟系统(桌面版)安装 NVIDIA 显卡驱动
麒麟系统(桌面版)安装 NVIDIA 显卡驱动 一、确认系统和显卡信息 # 查看系统版本 cat /etc/kylin-release# 查看内核版本 uname -r# 查看显卡型号 lspci | grep -i nvidia二、更新系统并安装编译依赖 sudo apt update && sudo apt upgrade -y sud…...
如何免费激活Windows和Office:3步实现永久激活的终极指南
如何免费激活Windows和Office:3步实现永久激活的终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼吗?是否遇到过Office突然变成只读模式…...
Qt5 super module网络编程指南:WebSocket、HTTP、MQTT通信实现
Qt5 super module网络编程指南:WebSocket、HTTP、MQTT通信实现 【免费下载链接】qt5 Qt5 super module 项目地址: https://gitcode.com/gh_mirrors/qt/qt5 Qt5 super module是一个功能强大的跨平台应用程序开发框架,提供了丰富的网络编程功能&…...
“我35岁,年薪50万,却觉得自己是个‘废人’”
你有过那种感觉吗?回头一看,工作了十年,简历上好像什么都做过,但心里却虚得要命,觉得自己随时可以被替代。尤其是当“35岁”这个魔咒般的年龄落在你头上时,这种恐慌感在深夜会加倍袭来。凌晨两点࿰…...
书匠策AI:那个让你论文查重从“红色地狱“直接变“绿色天堂“的神器
各位正在跟论文死磕的同学们,先别划走。 今天咱们不聊怎么写开题报告,不聊怎么搭框架,咱们聊一个所有人写完初稿后都会遭遇的终极BOSS——查重。 你有没有经历过这种崩溃:熬夜写了一万字,信心满满提交查重࿰…...
Unity+C#开发万人MMO服务器的实战架构与同步优化
1. 这不是“写个服务器”那么简单:先撕开“万人在线”的真实含义很多人看到“UnityC#开发万人MMO服务器”这个标题,第一反应是:“哦,用Unity做客户端,C#写个后端,Socket连一连,再加个数据库&…...
Burp Suite客户端证书失效的三大TLS握手决策点解析
1. 这不是证书问题,是Burp对TLS握手阶段的“信任错位”你有没有遇到过这样的场景:在Burp Suite里配置好了Client SSL Certificate,也勾选了“Use client certificate for all requests”,可一发请求,目标服务器就直接返…...
