Java常用设计模式——观察者模式

导航

  • 一、行为描述
  • 二、角色关系
  • 三、代码示例

一、行为描述

观察者会观察特定对象的状态变化,一旦状态有所变化或产生特定条件,被观察对象会通知给观察者,
而观察者则会依据通知信息采取特定处理措施。

举个例子,公司接到了一个大项目,各个部门都在观察项目的进度,一旦洽谈成功,项目正式进入启动阶段,
那么设计部就会出图纸,开发部就会出流程、出架构,售前部就会跑现场实地勘测…
项目就是被观察者,而各个部门就是观察者。

二、角色关系

观察者模式就两种角色——观察者和被观察者。

观察者对象往往会规范结构,一般是继承一个抽象观察者

I. 抽象观察者会定义3个重要内容

  1. 被观察对象的引用
  2. 构造函数——赋值被观察者、将this加入观察席
  3. 通知函数

II. 子类观察者仅调用父类构造,并实现通知函数即可。

III. 被观察者需要定义 4 个重要内容:

  1. 状态变量。这是观察者存在的目的和关键。
  2. 观察席。简单的说就是一个容纳观察者对象的容器,可以是List、也可以是Map,甚至是数组。
  3. 入席函数。观察者应该在构造的时候通过入席函数将自身加入到观察席容器中。
  4. 广播函数。与观察者的通知函数一样,被观察者应该在状态变化时(可以是 setter 函数)调用观察席中各个观察者的通知方法。

三、代码示例

抽象观察者:

/*** 观察者*/
@Data
public abstract class Observer {/*** 被观察对象*/protected ObserveTarget target;/*** 构造观察者时,直接建立观察者与被观察者的关系*/public Observer(ObserveTarget target) {this.target = target;target.getObservers().add(this);}/*** 接收广播消息*/abstract void recvMsg();
}

观察者1、观察者2:

/*** 观察者1号*/
public class Observer1 extends Observer {public Observer1(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {System.out.println("Observer1-state = " + target.getState());}
}
/*** 观察者2号*/
public class Observer2 extends Observer {public Observer2(ObserveTarget target) {super(target);}@Overridevoid recvMsg() {// 观察者可以视情况选择性处理接收的消息if (target.getState() == 1)System.out.println("Observer2-state = " + target.getState());}
}

被观察者:

/*** 被观察目标*/
@Data
public class ObserveTarget {/*** 状态变量*/private volatile int state;/*** 观察席(观察者容器)*/private Collection<Observer> observers = new ArrayList<>();/*** 入席函数(新增观察者)*/public void addObserver(Observer observer) {observers.add(observer);}public void setState(int state) {this.state = state;// 发送广播通知broadcast();}/*** 广播函数*/private void broadcast() {observers.forEach(o -> o.recvMsg());}
}

测试代码:

public class TestObserve {public static void main(String[] args) {ObserveTarget target = new ObserveTarget();Observer1 observer1 = new Observer1(target);Observer2 observer2 = new Observer2(target);target.setState(1);target.setState(2);target.setState(3);}
}
// output:
Observer1-state = 1
Observer2-state = 1
Observer1-state = 2
Observer1-state = 3

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

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

相关文章

dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单

前言这几天又拾起老本行&#xff0c;复习复习Android&#xff0c;才发现忘的差不多了&#xff0c;上午做了一个小Demo&#xff0c;配合Scroller做了一个轮播图&#xff0c;效果如下&#xff0c;但是不知为何&#xff0c;录制的GIF成这样&#xff0c;凑乎一下看看。原理是继承Vi…

JVM——CPU缓存架构与Java 内存模型

导航一、CPU缓存架构与一致性协议1.1 CPU缓存架构1.2 缓存行与伪共享问题1.3 MESI 缓存一致性协议1.4 伪共享的解决办法二、JMM Java 内存模型2.1 JMM 简介2.2 原子性、可见性、有序性2.3 八大内存交互操作2.4 happens-before 原则一、CPU缓存架构与一致性协议 1.1 CPU缓存架构…

蓝牙连接不上车要hfp_汽车上hfp是什么意思

汽车上hfp的全称是Hands-free-Profile&#xff0c;是一款让蓝牙设备控制电话&#xff0c;实现接听、挂断、拒接、语音拨号等功能的软件。hfp车载蓝牙功能使用上十分方便&#xff0c;可以有效地降低安全事故&#xff0c;在手机和车载蓝牙连接之后&#xff0c;在打电话的状况下可…

python3中的 input函数_Python3中的input函数

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

python转二进制字符串_python如何将二进制串(UTF-8)转换为字符串?

已知一个二进制串(UTF-8编码格式)列表(每一项为一字节8bit):b[01010000, 01111001, 01110100, 01101000, 01101111, 01101110, 11100101, 10100100, 10100111, 11100110, 10110011, 10010101]#即字符串"Python大法"如何将其转换为字符串呢?string ""for …

python中reshape_Numpy之reshape()使用详解

如下所示&#xff1a;Numpy中reshape的使用方法为:numpy.reshape(a, newshape, orderC)参数详解&#xff1a;1.a: type:array_like(伪数组&#xff0c;可以看成是对数组的扩展&#xff0c;但是不影响原始数组。)需要reshape的array2.newshape:新的数组新形状应与原形状兼容。如…

vue 手机端路由切换滑动_vue移动端router-view嵌套实现底部导航切换

路由使用 vue-router组件库使用 vue-ydui效果图&#xff1a;登录.png主界面-首页.png主界面-办事大厅.png项目结构图片.png大体流程图片.png路由代码import Vue from vueimport Router from vue-routerimport home from ../page/homeimport office from ../page/officeimport m…

bs4 乱码_Python BeautifulSoup中文乱码问题的2种解决方法

解决方法一&#xff1a;使用python的BeautifulSoup来抓取网页然后输出网页标题,但是输出的总是乱码,找了好久找到解决办法,下面分享给大家首先是代码复制代码 代码如下:from bs4 import BeautifulSoupimport urllib2url //www.jb51.net/page urllib2.urlopen(url)soup Beaut…

白噪声检测_科学家尝试用智能扬声器的白噪声来监测婴儿的呼吸运动

华盛顿大学的一支研究团队&#xff0c;刚刚介绍了他们开发的一种新型智能扬声器技术。这种设备能够借助白噪声来安抚熟睡的婴儿&#xff0c;并监测他们的呼吸和运动。具体说来是&#xff0c;通过智能扬声器发出的白噪声&#xff0c;原型设备能够将之与生命体征监测仪的数据相匹…

最大值_285期 博最大值2路,已经箭在弦上!

往期数据P-5掉码 跨度 和尾 012断路 余数和 位数86072 1 8 4 200 断1路2 5 对214对 双双双79703 0 2 3 101 断2路2 4 对215对 单单单62386 0 4 1 020 断1路2 4 错216对 双双单71903 0 8 7 110 断2路2 5 错217对 单单单64838 0 4 8 012 来3路3 4 错218对 双双双02052 0 2 2 020 …

商品领域ddd_为 Gopher 打造 DDD 系列:领域模型-资源库

前言&#xff1a; 作为领域模型中最重要的环节之一的Repository&#xff0c;其通过对外暴露接口屏蔽了内部的复杂性&#xff0c;又有其隐式写时复制的巧妙代码设计&#xff0c;完美的将DDD中的Repository的概念与代码相结合&#xff01;Repository资源库通常标识一个存储的区域…

mysql5.7主从全备恢复_Mysql5.7—运维常用备份方式(超全)

小生博客&#xff1a;http://xsboke.blog.51cto.com小生 Q Q&#xff1a;1770058260-------谢谢您的参考&#xff0c;如有疑问&#xff0c;欢迎交流一、 Mysqldump备份结合binlog日志恢复使用mysqldump进行全库备份&#xff0c;并使用binlog日志备份&#xff0c;还原时&#xf…

客户端连接mysql 自动断开_MySql连接空闲8小时自动断开的原因及连接池配置方法...

数据库连接超时时间查询非交互式超时时间&#xff0c;如 JDBC 程序show global variables like wait_timeout;交互式超时时间&#xff0c;如数据库工具show global variables like interactive_timeout;MySQL服务器默认的“wait_timeout”是28800秒即8小时&#xff0c;意味着如…

docker 运行容器_Docker之运行 Django 容器

首先此篇笔记默认你已经安装好了 Docker&#xff0c;并了解 Docker 的基础概念&#xff0c;诸如镜像、容器、以及他们之间的关系等。如果不太了解&#xff0c;等我回头了解清楚以后&#xff0c;可以再写一篇文章阐述一下。&#xff08;狗头当然&#xff0c;对于这篇文章&#x…

mysql类似的数据库_MemSQL学习笔记-类似MySQL的数据库

http://gigaom.com/cloud/ex-facebookers-launch-memsql-to-make-your-database-fly/-- 多主-从http://www.mysqlops.com/2012/02/14/diy_multi_master_replication.htmlhttp://www.cnblogs.com/liuhao/archive/2012/06/26/2563702.html前facebook员工和前微软sql server工程师…

mysql8.0与mysql7.0_MySQL 5.7 vs 8.0,哪个性能更牛?

测试mysql5.7和mysql8.0分别在读写&#xff0c;选定&#xff0c;只写模式下不同并发时的性能(tps&#xff0c;qps)最早测试使用版本为mysql5.7.22和mysql8.0.15sysbench测试前先重启mysql服务&#xff0c;并清除os的缓存(避免多次测试时命中缓存)每次进行测试都是新生成测试数据…

linux+mysql+导出备份_Linux系统MySQL备份的导入导出的具体分析

问题描述如何对 ECS Linux 系统中的 MySQL 进行备份的导入和导出。处理办法MySQL 备份的导出MySQL 备份的导入MySQL 备份的导出注意&#xff1a;如果您使用的是帮助中心的一键环境配置&#xff0c;那么 MySQL 的安装目录是 /alidata/server/mysql。如果您将 MySQL 安装到其他目…

springmvc使用requestmapping无法访问控制类_研究人员称人类使用的新烟碱类杀虫剂让蜜蜂无法入睡...

来自布里斯托尔大学的科学家进行了研究&#xff0c;显示常见的杀虫剂可以阻止蜜蜂和苍蝇睡个好觉。就像人类一样&#xff0c;许多昆虫也需要睡眠才能正常工作。然而&#xff0c;如果它们接触过新烟碱类杀虫剂&#xff0c;它们的睡眠就会受到影响&#xff0c;新烟碱类杀虫剂是一…

linux 监控mysql脚本_Linux系统MySQL主从同步监控shell脚本

操作系统&#xff1a;CentOS系统目的&#xff1a;定时监控MySQL数据库主从是否同步&#xff0c;如果不同步&#xff0c;记录故障时间&#xff0c;并执行命令使主从恢复同步状态1、创建脚本文件vi /home/crontab/check_mysql_slave.sh #编辑&#xff0c;添加下面代码#!/bin/sh…

mysql 1066解决方法_MySQL查询语法帮助:错误#1066-表格/别名不唯...

我有四个表,user,user_billingprofile,user_shippingprofile和user_address.用户&#xff1a;userId,dateCreateduser_billingprofile&#xff1a;userId,地址user_shippingprofile&#xff1a;userId,地址user_address&#xff1a;随机地址废话这是我必须一目了然地获取用户帐…