设计模式之观察者模式

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

例子:报纸-邮局-用户

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

被观察者

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,一经查实,立即删除!

相关文章

Docker快速入门笔记

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

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次方相加是否这个…

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

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

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

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

【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 - 设置为样式属…

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组织进行办发的&…

【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

目录 前言 wrk 优点 缺点 jmeter 优点 缺点 locust 优点 缺点 总结 资料获取方法 前言 当你想做性能测试的时候&#xff0c;你会选择什么样的测试工具呢&#xff1f;是会选择wrk&#xff1f;jmeter&#xff1f;locust&#xff1f;还是loadrunner呢&#xff1f; 今…

【图论】无向图连通性(tarjan算法)

割边&#xff1a;dfn[u]<low[v] 割点&#xff1a;dfn[u]<low[v] (若为根节点&#xff0c;要有两个v这样的点) 一.知识点&#xff1a; 1.连通&#xff1a; 在图论中&#xff0c;连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…

Eureka注册中心 与 OpenFeign调用接口

需求 一个应用通过接口&#xff0c;调用另一个应用的接口。使用OpenFeign来实现接口调用。 说明 通过OpenFeign&#xff08;本文接下来简称Feign&#xff09;调用远程接口&#xff0c;需要Eureka注册中心的支持。 OpenFeign调用接口的逻辑如下&#xff1a; 提供接口的应用…

文章详情页 - 评论功能的实现

目录 1. 准备工作 1.1 创建评论表 1.2 创建评论实体类 1.3 创建 mapper 层评论接口和对应的 xml 实现 1.4 准备评论的 service 层 1.5 准备评论的 controller 层 2. 总的初始化详情页 2.1 加载评论列表 2.1.1 实现前端代码 2.1.2 实现后端代码 2.2 查询当前登录用户的…

list与流迭代器stream_iterator

运行代码&#xff1a; //list与流迭代器 #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend ist…

Redis的安装部署以及基本的使用

目录 一、Linux下直接安装Redis &#xff08;1&#xff09;下载Redis安装包 &#xff08;2&#xff09;安装GCC编译环境 &#xff08;3&#xff09;安装Redis &#xff08;4&#xff09;服务启动 &#xff08;5&#xff09;后台启动 二、使用Docker安装部署Redis &…

2023年第四届“华数杯”数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常检测 异常…

云原生之深入解析如何在Kubernetes下快速构建企业级云原生日志系统

一、概述 ELK 是三个开源软件的缩写&#xff0c;分别表示 Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat&#xff0c;它是一个轻量级的日志收集处理工具 (Agent)&#xff0c;Filebeat 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输…

Django使用用户列表的展示和添加

接着上一篇&#xff1a;https://blog.csdn.net/javascript_good/article/details/132027702 来实现用户表的查询和添加 1、创建数据库表 在models.py 中&#xff0c;增加UserInfo类&#xff0c;包括字段姓名、密码、年龄、账号余额、入职时间、所属部门、性别 verbose_name 就…