观察者模式概述

观察者模式,它用于建立一种对象与对象之间的依赖关系,
一个对象发生改变将自动通知其他对象,
其他对象将相应做出反应。在观察者模式种,发生改变的对象称为观察目标,
而被通知的对象称为观察者,一个观察目标可以对应多个观察者,
而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,
使得系统易于扩展。

观察者模式(Observer Pattern)定义对象之间的一种一对多依赖关系,
使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式的别名包括发布-订阅模式、模型-试图模式、
源-监听器模式或从属者模式。观察者模式是一种对象行为模式。
Subject(目标):目标又称为主题,
它是指被观察的对象。在目标中定义了一个观察者集合,
一个观察目标可以接受任意数量的观察者来观察,
它提供一系列方法来增加和删除观察者对象,
同时它定义了通知方法notify()。
目标类可以是接口,也可以是抽象类或具体类。

ConcreteSubject(具体目标):
具体目标是目标类的子类,通常它包含又经常发生改变的数据,
当他的状态发生改变时,向它的各个观察者发出通知;
同时它还实现了在目标类中定义的抽象业务逻辑方法
(如果有的话)。如果无需扩展目标类,则具体目标类可以省略。

Observer观察者:
观察者将对观察目标的改变做出反应,
观察者一般定义为接口,改接口声明了更新数据的方法
update(),因此又称为抽象观察者。

ConcreteObserver具体观察者:
在具体观察者中维护一个指向具体目标对象的引用,
它存储具体观察者的有关状态,
这些状态需要和具体目标的状态保持一致。
它实现了在抽象观察者Observer中定义的
update方法。通常在实现时,可以调用具体目标类的
attach方法将自己添加到目标类的集合中或通过detach()
方法将自己从目标类的集合中删除。

观察模式描述了如何建立对象于对象之间的依赖关系,
以及如何构造满足这种需求的系统。
观察者模式包含观察目标和观察者两类对象,
一个目标可以有任意数目的与之相依赖的观察者,
一旦观察目标的状态发生改变,所有的观察者都将得到通知。
作为对这个通知的响应,每个观察者都将监听观察目标的状态
以使其状态与目标状态同步,这个交互也称为发布-订阅。
Publish-Subject。观察目标是通知的发布者。
它发出通知并不需要知道谁是它的观察者,可以有任意数目的观察者订阅
它并接收通知。

public class Main{public static void main(String[] args) {/*观察者模式*/Subject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();subject.add(observer1);subject.add(observer2);subject.notifyObserver();}}
public abstract class Subject {//定义一个观察集合用于存储所有观察集合。protected ArrayList<Observer> observers = new ArrayList<Observer>();//protected ArrayList <observers> Observer = new ArrayList<>();//向观察集合插入一个观察者public void add(Observer observer){observers.add(observer);}//向观察集合删除一个观察者public void detach(Observer observer){observers.remove(observer);}//声明抽象通知方法public abstract void notifyObserver();}
public interface Observer {public void update();
}
public class ConcreteSubject extends Subject{@Overridepublic void notifyObserver() {// 实现通知方法for(Object obs:observers){//遍历观察者集合,调用每一个观察者的响应方法((Observer)obs).update();}}
}
public class ConcreteObserver1 implements Observer{@Overridepublic void update() {System.out.println("具体观察者1作出反应!");}
}
public class ConcreteObserver2 implements Observer{@Overridepublic void update() {System.out.println("具体观察者2作出反应!");}
}

具体观察者1作出反应!
具体观察者2作出反应!

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

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

相关文章

docker学习(二十、network使用示例host、none)

文章目录 一、host应用示例总结 二、none应用示例总结 network相关内容&#xff1a; docker学习&#xff08;十八、network介绍&#xff09; docker学习&#xff08;十九、network使用示例bridge&#xff09; docker学习&#xff08;二十、network使用示例host、none&#xff0…

Unity 代码控制Text自适应文本高度

在使用代码给Text赋值时&#xff0c;且文本有多段&#xff0c;并需要根据实际文本高度适配Text组件的高度时&#xff0c;可以使用以下方法&#xff1a; //Text文本 public TextMeshProUGUI text;void Start() {//代码赋值文本text.text "好!\n很好!\n非常好!";//获…

postman入门使用

前言 对于postman的基础其实很容易上手实现&#xff0c;也有很多教程。 对于小编我来说&#xff0c;也基本可以实现开发任务。 但是今年我们的高级测试&#xff0c;搞了一下postman&#xff0c;省去很多工作&#xff0c;让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维&#xff0c;想到用docker 来部署jenkins &#xff0c;然后jenkins来部署java代码&#xff0c;做到了开箱即用&#xff0c;自动发布代码…

Docker (compose、安装、常用命令整理、compose编排) -day06

一、概念 Docker-Compose就是容器编排&#xff0c;负责实现对Docker容器集群的快速编排 Compose允许用户通过一个单独的docker-compose.yml模板文件&#xff08;YAML 格式&#xff09;来定义一组相关联的应用容器为一个项目&#xff08;project&#xff09;。 可以很容易地用一…

Spring系列学习三、Spring的基础组件

Spring的基础组件 一、 什么是Bean及Bean的生命周期二、 什么是依赖注入(DI)与控制反转(IOC)三、 Spring的作用域与生命周期四、 Spring的配置方式(XML与基于注解的配置)五、HelloWorld示例六、结语 欢迎回来各位亲爱的小伙伴&#xff01;我们已经滑过Spring的门槛&#xff0c;…

laravel api资源的问题记录

resource 转换层 可以帮助我们转换一些字段的结果&#xff0c;类似前端的filter。 可以使用比如对象或者模型的形式来处理&#xff0c;但使用sql查询会导致n1的问题。如图&#xff1a; 层次嵌套很多&#xff0c;而且很深&#xff0c;这样虽然开发方便了&#xff0c;但是维护就…

大华NVR和IPC通过主动注册协议方式接入AS-V1000视频监控平台的步骤

最近有人经常用到有的型号的大华网路摄像机&#xff0c;不支持国标GB28181标准&#xff0c;问我们能否接入到在公网的AS-V1000平台 &#xff1f; 我们早期就开发了大华的主动注册协议SDK&#xff0c;能够支持大华的NVR和IPC接入到AS-V1000平台。 今天就直接讲解如何一步步的把局…

【ES6】Class继承-super关键字

目录 一、前言二、ES6与ES5继承机制区别三、super作为函数1、构造函数this1&#xff09;、首先要明确this指向①、普通函数②、箭头函数③、注意事项 2&#xff09;、其次要明确new操作符做了哪些事情 2、super()的用法及注意点1&#xff09;、用法2&#xff09;、注意点 四、s…

【Docker-Dev】Mac M2 搭建docker mysql

Mac M2 搭建Mysql 1、前言2、前置说明-Docker的代理访问3、前置说明-Mysql的镜像访问3.1、提取信息3.1.1、开启Mysql的实例3.1.2、Dokcer连接Mysql3.1.3、官方简易版的docker-compose3.1.4、如何登录mysql bash3.1.5、自定义my.cnf文件3.1.6、如何知道其他自定义配置项 4、M2安…

LeetCode刷题--- 有效的数独

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主…

什么是负载均衡?

负载均衡是指在计算机网络领域中&#xff0c;将客户端请求分配到多台服务器上以实现带宽资源共享、优化资源利用率和提高系统性能的技术。负载均衡可以帮助小云有效解决单个服务器容量不足或性能瓶颈的问题&#xff0c;小云通过平衡流量负载&#xff0c;使得多台服务器能够共同…

模式识别与机器学习(十二):Stacking

原理 在本次实验中以决策树、svm和随机森林为基学习器&#xff0c;以决策树为元学习器。 Stacking的做法是首先构建多个不同类型的一级学习器&#xff0c;并使用他们来得到一级预测结果&#xff0c;然后基于这些一级预测结果&#xff0c;构建一个二级学习器&#xff0c;来得到…

基于MATLAB的泊松分布,正态分布与伽玛分布(附完整代码与例题)

目录 一. 泊松分布 1.1 理论部分 1.2 MATLAB函数模型 1.3 例题 二. 正态分布 2.1 理论部分 2.2 MATLAB函数模型 2.3 例题 三. 伽玛分布 3.1 理论部分 3.2 MATLAB函数模型 3.3 例题 一. 泊松分布 1.1 理论部分 Poisson分布是离散的&#xff0c;其x值只能取自然数。…

const和constexpr

constexpr 是 C 11 标准新添加的关键字&#xff0c;在此之前&#xff08;C 98/03标准&#xff09;只有 const 关键字&#xff0c;其在实际使用中经常会表现出两种不同的语义&#xff08;常量和只读&#xff09;。 dis_1() 函数中的“const int x”只是想强调 x 是一个只读的变量…

Neo4j 5建库

Neo4j 只有企业版可以运行多个库&#xff0c;社区版无法创建多个库&#xff0c;一个实例只能运行一个库&#xff1b; 如果业务需要使用多个库怎么办呢&#xff1f; 就是在一个机器上部署多个实例&#xff0c;每个实例单独一个库名 这个库的名字我们可以自己定义&#xff1b; …

Hadoop之HDFS 详细教程

1、HDFS概述 Hadoop 分布式系统框架中&#xff0c;首要的基础功能就是文件系统&#xff0c;在 Hadoop 中使用FileSystem 这个抽象类来表示我们的文件系统&#xff0c;这个抽象类下面有很多子实现类&#xff0c;究竟使用哪一种&#xff0c;需要看我们具体的实现类&#xff0c;在…

实战13 分配角色

目录 1、分配角色思路 2、分配角色回显接口实现 3、分配角色回显前端实现 3.1 编写前端api脚本代码 3.2 编写分配角色窗口代码 3.3 编写分配角色回显脚本代码 4、分配角色后端接口 4.1 UserRoleDTO 4.2 UserMapper 4.3 UserMapper.xml 4.4 UserService 4.5 UserServ…

ASP.Net实现新闻添加查询(三层架构,含照片)

目录 演示功能&#xff1a; 点击启动生成页面 点击搜索模糊查询 点击添加跳转新界面 ​编辑 点击Button添加 步骤&#xff1a; 1、建文件 ​编辑 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper&#xff08;对数据库进行操作…