设计模式之观察者模式

定义:对象间的一种一对多的依赖关系,当一个对象的状态发货所能改变时,所有依赖它的对象都得到通知并被自动更新。

例子:报纸-邮局-用户

在这里插入图片描述 不用设计模式实现

被观察者

package com.tao.YanMoDesignPattern.observer.case3_Origin;import java.util.Observable;/*** @Author Mi_Tao* @Date 2023/7/23* @Description Java本身带有的观察者* @Version 1.0**/
public class NewsPaper extends Observable {// 具体的报纸内容private String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;// 内容有了,说明出报纸了,那就通知所有的读者(观察者)// 注意在这里用Java 的Observer 模式的时候,下面这句话不可少this.setChanged();// 主动通知,这里用的是推的方式this.notifyObservers(this.content);// 如果用拉的方式
//        this.notifyObservers();}
}

观察者

package com.tao.YanMoDesignPattern.observer.case3_Origin;import com.tao.YanMoDesignPattern.observer.pattern.Subject;import java.util.Observable;
import java.util.Observer;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class Reader implements Observer {public String getName() {return name;}public void setName(String name) {this.name = name;}// 读者的姓名private String name;@Overridepublic void update(Observable o, Object arg) {// 推System.out.println(name +"收到报纸了,阅读先.目标过来的内容是:"+ arg);// 拉System.out.println(name +"收到报纸了,阅读先.主动拉倒的内容是 :"+((NewsPaper)o).getContent());}
}

测试

package com.tao.YanMoDesignPattern.observer.case3_Origin;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 使用观察者模式* @Version 1.0**/
public class Client {public static void main(String[] args) {// 创建一个报纸,作为被观察者NewsPaper subject = new NewsPaper();// 创建阅读者 ,也就是观察者Reader reader = new Reader();reader.setName("涛");Reader reader1 = new Reader();reader1.setName("张三");Reader reader2 = new Reader();reader2.setName("Li");// 注册阅读者subject.addObserver(reader1);subject.addObserver(reader2);subject.addObserver(reader);subject.setContent("现在使用的是Java自带的Oberver Observable 实现观察者模式!!");}
}

标准的观察者模式

package com.tao.YanMoDesignPattern.observer.pattern;public interface Observer {// 更新接口public void update(Subject subject);}
package com.tao.YanMoDesignPattern.observer.pattern;import java.util.ArrayList;
import java.util.List;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class Subject {// 用来保存注册的观察者对象private List<Observer> observers = new ArrayList<>();/*** 注册观察者对象* @param observer*/public void attach(Observer observer){observers.add(observer);}public void detach(Observer observer){observers.remove(observer);}/*** 通知所有的观察者*/protected void notifyObservers(){for (Observer observer : observers) {observer.update(this);}}
}
package com.tao.YanMoDesignPattern.observer.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class ConcreteObserver implements Observer {// 观察者的状态private String observerState;public void update(Subject subject) {// 具体的更新实现// 这里可能需要更新观察者的状态,使其与目标的状态保持一致observerState = ((ConcreteSubject) subject).getSubjectState();}
}
package com.tao.YanMoDesignPattern.observer.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 具体的目标对象,负责把有关状态存入到相应的观察者对象* 并在自己状态改变时,通知各个观察者* @Version 1.0**/
public class ConcreteSubject extends Subject{// 目标对象的状态private String subjectState;public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;// 状态发生改变,通知各个观察者this.notifyObservers();}
}

使用观察者模式实现

被观察者(报纸)

package com.tao.YanMoDesignPattern.observer.case1_Newspaper;import com.tao.YanMoDesignPattern.observer.pattern.Subject;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class NewsPaper extends Subject {// 具体的报纸内容private String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;// 内有有了,说明出报纸了,那就通知所有的读者(观察者)notifyObservers();}
}

观察者(读者)

package com.tao.YanMoDesignPattern.observer.case1_Newspaper;import com.tao.YanMoDesignPattern.observer.pattern.Observer;
import com.tao.YanMoDesignPattern.observer.pattern.Subject;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class Reader implements Observer {public String getName() {return name;}public void setName(String name) {this.name = name;}// 读者的姓名private String name;@Overridepublic void update(Subject subject) {System.out.println(name + "收到报纸了,阅读它。内容是: "+((NewsPaper)subject).getContent());}}

测试

package com.tao.YanMoDesignPattern.observer.case1_Newspaper;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 使用观察者模式* @Version 1.0**/
public class Client {public static void main(String[] args) {// 创建一个报纸,作为被观察者NewsPaper subject = new NewsPaper();// 创建阅读者 ,也就是观察者Reader reader = new Reader();reader.setName("涛");Reader reader1 = new Reader();reader1.setName("张三");Reader reader2 = new Reader();reader2.setName("Li");// 注册阅读者subject.attach(reader1);subject.attach(reader2);subject.attach(reader);subject.setContent("2023-07-23 出新报纸了!!");}
}

观察者模式的本质:触发联动

何时使用观察者模式在这里插入图片描述

相关模式
在这里插入图片描述
在这里插入图片描述

本文参考:《研磨设计模式》
相关代码: https://gitee.com/zitaoyang/design-mode

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

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

相关文章

计算语言模型计算每秒钟生成的token数量it/s

在 main() 函数的stream循环中&#xff0c;我们可以计算每秒钟生成的token数量&#xff0c;然后输出 it/s。在流式生成过程中&#xff0c;我们可以使用Python的time模块来计算速度。在测试时&#xff0c;生成速度会受到多个因素的影响&#xff0c;包括设备性能、模型大小、输入…

Docker快速入门笔记

Docker快速入门 前言 当今软件开发领域的一股热潮正在迅速兴起&#xff0c;它融合了便捷性、灵活性和可移植性&#xff0c;让开发者们欣喜若狂。它就是 Docker&#xff01;无论你是一个初学者&#xff0c;还是一位经验丰富的开发者&#xff0c;都不能错过这个引领技术浪潮的工…

基本不等式@平均值不等式@双勾函数不等式

文章目录 基本不等式基本齐次不等式一次形式&#x1f47a;基本不等式拓展拓展1拓展2 算数平均数和几何平均数不等式应用恒等变形 双勾函数不等式导数函数单调性&#x1f388;求解过程 极值点和极值函数单调性的简单证明&#x1f388; 基本不等式 基本齐次不等式 设 a , b ∈ …

windwos server 2008 更新环境,且vs_redis 安装失败

KB2919442 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 KB2919355 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 安装步骤:先安装442,后安装355

C语言打印水仙花数

“水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#xff1d;13&#xff0b;53&#xff0b;3^3&#xff0c;则153是一个“水仙花数”。 思路&#xff0c;先把每个数的每位算出来&#xff0c;然后再判断他们的3次方相加是否这个…

Ansible中常用的模块结合案例使用详解

Ansible中常用的模块结合案例使用详解 1. file模块2. copy模块3. yum_repository模块4. yum模块5. service模块6. systemd模块7. cron模块8. user模块9. group模块10. fetch模块11. get_url模块12. unarchive模块13. synchronize模块14. block模块15. parted模块16. firewalld模…

Linux ps命令:查看正在运行的进程

ps 命令是最常用的监控进程的命令&#xff0c;通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令的基本格式如下&#xff1a; [rootlocalhost ~]# ps aux #查看系统中所有的进程&#xff0c;使用 BS 操作系统格式 [rootlocalhost ~]# ps -le #查看系统中所有的进程&am…

Vue中常用到的标签和指令

一、标签 在 Vue 中&#xff0c;并没有特定的标签是属于 Vue 的&#xff0c;因为 Vue 是一个用于构建用户界面的框架&#xff0c;可以与 HTML 标签一起使用。Vue 中可以使用的标签和元素基本上与 HTML 标准一致。 以下是一些常见的HTML标签&#xff0c;也可以在 Vue 中使用&a…

HTML+CSS+JavaScript:随机抽奖案例

一、需求 在时代少年团的七个人中&#xff0c;随机抽取一个人获得一等奖&#xff0c;再抽取一个获二等奖&#xff0c;再抽取一个获三等奖。注意同一个人不能同时获得多个奖项 如下图所示 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写…

oracle数据库dbLink的使用

Oracle的数据库链路&#xff08;dbLink&#xff09;是一种允许在两个不同的数据库实例之间进行通信和数据交换的功能。它可以让你在一个数据库中访问另一个数据库的对象和数据&#xff0c;就像它们属于同一个数据库一样。 创建一个link: CREATE public DATABASE LINK link_sco…

计算机网络用户接入层设计

用户接入层为用户提供访问核心网络的能力&#xff0c; 为用户提供共享/交换的带宽分配&#xff0c;按照业主要求,并考虑到端口密度的要求以及 设备的性能价格比,建议选用 Catalyst 3524XL和 Catalyst 3548XL 工作组交换 机&#xff0c;分别放置于配线间中。如同一配线间需两台以…

PyCharm安装使用2023年教程,PyCharm与现流行所有编辑器对比。

与PyCharm类似的功能和特性的集成开发环境&#xff08;IDE&#xff09;和代码编辑器有以下几种&#xff1a; Visual Studio Code&#xff08;VS Code&#xff09;&#xff1a;由Microsoft开发&#xff0c;VS Code是一个高度可定制和可扩展的代码编辑器。它支持多种编程语言&am…

深入了解Redis-实战篇-短信登录

深入了解Redis-实战篇-短信登录 一、故事背景二、知识点主要构成2.1、短信登录2.1.1、生成随机短信验证码引入maven依赖生成验证码 2.1.2、实现登录校验拦截器2.1.3、基于Redis实现短信登录2.1.3.1、发送验证码时存入Redis2.1.3.2、登录时校验验证码 2.1.4、解决状态登录刷新的…

【phaser微信抖音小游戏开发006】给文本增加点击事件

新建st006&#xff0c;为文本增加点击事件。 我们加了一个计数的count&#xff0c;点击一次增加一下&#xff0c;并显示到屏幕上去。 效果如下图&#xff1a; 其它的对象以此类推即可&#xff0c;先置inputEnable为true,然后再增加一个inputDown事件即可。

Halcon学习之一维测量实战之测量矩形(一)

一、采集图像 (1)测量充电器 测量充电器的引脚,然后每次旋转充电器,让测量矩形都跟着它转,这就是定位+测量, (2)测量钥匙 (3)测量瓶盖 我们后面还会涉及到拟合的问

无涯教程-jQuery - css( properties )方法函数

css(properties)方法将键/值对象设置为所有匹配元素的样式属性。 css( properties ) - 语法 selector.css( properties ) 上面的语法可以写成如下- selector.css( {key1:val1, key2:val2....keyN:valN}) 这是此方法使用的所有参数的描述- key:value - 设置为样式属…

自动驾驶TPM技术杂谈 ———— 汽车转向系统术语和定义

文章目录 术语和定义基本术语转向系统转向参数转向系统形式转向车轮布置形式转向传动形式 功能安全术语 技术要求一般要求失效规定 试验方法汽车试验汽车转向系统完好时转向操纵力的测量汽车转向系统出现故障时转向操纵力的测量 挂车试验 附录转向圆试验功能安全概念安全分析 术…

SQL注入之sqlmap

SQL注入之sqlmap 6.1 SQL注入之sqlmap安装 sqlmap简介&#xff1a; sqlmap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描&#xff0c;发现并利用给定的URL的SQL注入漏洞&#xff0c;目前支持的数据库是MS-SQL,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注…

PHP8的变量-PHP8知识详解

昨天我们讲解了PHP8的常量&#xff0c;今天讲解PHP8的变量。常量有定义常量和预定义常量&#xff0c;变量呢&#xff1f;那就没有定义变量了&#xff0c;那叫给变量赋值&#xff0c;但是还是有预定义变量的。下面就给大家讲解什么是变量、变量赋值及使用及预定义变量。 一、什么…

第六次作业 密码学

发送者为Alice 接受者为Bob 首先对原始信息进行hash运算得到信息摘要&#xff0c;然后使用发送者Alice私钥进行签名&#xff08;签名的作用是验证该信息是Alice的&#xff09;&#xff0c;然后将原始信息数字签名Alice证书&#xff08;该Alice的证书是由CA组织进行办发的&…