java设计模式之观察者模式

news2024/11/15 17:37:39

一:观察者模式

1.什么是观察者模式?
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
观察者模式的基本介绍
又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

2.观察者模式适合应用场景
1.当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。
2.当应用中的一些对象必须观察其他对象时, 可使用该模式。 但仅能在有限时间内或特定情况下使用。

3.观察者模式优缺点
优点:
1.开闭原则。 你无需修改发布者代码就能引入新的订阅者类 (如果是发布者接口则可轻松引入发布者类)。
2.你可以在运行时建立对象之间的联系。
缺点:
1.订阅者的通知顺序是随机的。
4.观察者模式角色:
Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

二:观察者模式代码实现

抽象被观察者

//(抽象被观察者)接口, 让(具体观察者)WeatherData 来实现
public interface Subject {
	
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}

具体被观察者

/**
 * 类是核心
 * 1. 包含最新的天气情况信息 
 * 2. 含有 观察者集合,使用ArrayList管理
 * 3. 当数据有更新时,就主动的调用   ArrayList, 通知所有的(接入方)就看到最新的信息
 * @author Administrator
 *
 */
///具体被观察者
public class WeatherData implements Subject {
	private float temperatrue;
	private float pressure;
	private float humidity;
	//观察者集合
	private ArrayList<Observer> observers;
	
	//加入新的第三方

	public WeatherData() {
		observers = new ArrayList<Observer>();
	}

	public float getTemperature() {
		return temperatrue;
	}

	public float getPressure() {
		return pressure;
	}

	public float getHumidity() {
		return humidity;
	}

	public void dataChange() {
		//调用 接入方的 update
		
		notifyObservers();
	}

	//当数据有更新时,就调用 setData
	public void setData(float temperature, float pressure, float humidity) {
		this.temperatrue = temperature;
		this.pressure = pressure;
		this.humidity = humidity;
		//调用dataChange, 将最新的信息 推送给 接入方 currentConditions
		dataChange();
	}

	//注册一个观察者
	@Override
	public void registerObserver(Observer o) {
		// TODO Auto-generated method stub
		observers.add(o);
	}

	//移除一个观察者
	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
		if(observers.contains(o)) {
			observers.remove(o);
		}
	}

	//遍历所有的观察者,并通知
	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		for(int i = 0; i < observers.size(); i++) {
			observers.get(i).update(this.temperatrue, this.pressure, this.humidity);
		}
	}
}

抽象观察者

//抽象观察者接口,由具体观察者来实现()
public interface Observer {

	public void update(float temperature, float pressure, float humidity);
}

具体观察者

//具体观察者
public class BaiduSite implements Observer {

	// 温度,气压,湿度
	private float temperature;
	private float pressure;
	private float humidity;

	// 更新 天气情况,是由 WeatherData 来调用,我使用推送模式
	public void update(float temperature, float pressure, float humidity) {
		this.temperature = temperature;
		this.pressure = pressure;
		this.humidity = humidity;
		display();
	}

	// 显示
	public void display() {
		System.out.println("===百度网站====");
		System.out.println("***百度网站 气温 : " + temperature + "***");
		System.out.println("***百度网站 气压: " + pressure + "***");
		System.out.println("***百度网站 湿度: " + humidity + "***");
	}

}

//具体观察者
public class CurrentConditions implements Observer {

	// 温度,气压,湿度
	private float temperature;
	private float pressure;
	private float humidity;

	// 更新 天气情况,是由 WeatherData 来调用,我使用推送模式
	public void update(float temperature, float pressure, float humidity) {
		this.temperature = temperature;
		this.pressure = pressure;
		this.humidity = humidity;
		display();
	}

	// 显示
	public void display() {
		System.out.println("***Today mTemperature: " + temperature + "***");
		System.out.println("***Today mPressure: " + pressure + "***");
		System.out.println("***Today mHumidity: " + humidity + "***");
	}
}

测试

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个WeatherData
		WeatherData weatherData = new WeatherData();
		
		//创建观察者
		CurrentConditions currentConditions = new CurrentConditions();
		BaiduSite baiduSite = new BaiduSite();
		
		//注册到weatherData
		weatherData.registerObserver(currentConditions);
		weatherData.registerObserver(baiduSite);
		
		//测试
		System.out.println("通知各个注册的观察者, 看看信息");
		weatherData.setData(10f, 100f, 30.3f);
		
		
		weatherData.removeObserver(currentConditions);
		//测试
		System.out.println();
		System.out.println("通知各个注册的观察者, 看看信息");
		weatherData.setData(10f, 100f, 30.3f);
	}

在这里插入图片描述

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

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

相关文章

从阿里云容器攻防矩阵API安全生命周期,看如何构建金融安全云原生平台

【编者按】云原生技术正在助力银行通过差异化业务进行创新&#xff0c;却也带来了由于研发/运维人员对新架构不熟悉所导致的基础设施风险、业务风险及数据暴露风险。如何在飞速更迭的技术环境下保持业务持续发展&#xff0c;同时保证业务整体的安全性&#xff0c;满足不断增强的…

设计模式-装饰器模式

装饰器模式也称为包装模式是指在不改变原有对象的基础上&#xff0c;将功能附加到对象上&#xff0c;提供比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式 装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态的扩展类的功能 装饰器模式通用UML类图 主要角…

培训学校管理系统之家校管理

近年来&#xff0c;伴随着信息技术的进步。除了不少学校开展了数字化校园的建设&#xff0c;一些培训机构也在使用数字化系统进行管理。同时&#xff0c;由于招生数量的不断增长&#xff0c;如何解决学生、教师、家长三者之间的联系沟通问题&#xff0c;促进教学管理任务的有效…

排序(详解)

排序排序的概念常见的排序算法直接插入排序希尔排序&#xff08;缩小增量排序&#xff09;选择排序堆排序冒泡排序快排&#xff08;递归&#xff09;霍尔版本挖坑法前后指针法快排&#xff08;非递归&#xff09;归并排序&#xff08;递归&#xff09;归并排序&#xff08;非递…

区块链动态化监管方案

前言 监控运维模块是区块链BaaS的核心模块之一&#xff0c;我们针对联盟链、主机和系统等多个监控对象提供丰富的监控指标。通过BaaS提供的综合监控大屏&#xff0c;用户可直观洞悉区块链业务全局&#xff0c;实现7*24小时监控全覆盖。 但随着BaaS业务的扩展&#xff0c;对监…

jsp教师教学信息管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目

一、源码特点 JSP 教师教学信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库文&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlserver2008…

微服务拆分总结(一)

微服务要解决的问题&#xff1a; 1、可以快速迭代&#xff1b; 2、解决三高问题&#xff08;高并发&#xff0c;高可用&#xff0c;高性能&#xff09; 什么时候拆分微服务&#xff0c;拆分的时机是什么&#xff1f; 提交频繁代码冲突&#xff1b; 模块之间耦合严重&#…

RocketMQ 重试机制详解及最佳实践

作者&#xff1a;斜阳 引言 本文主要介绍在使用 RocketMQ 时为什么需要重试与兜底机制&#xff0c;生产者与消费者触发重试的条件和具体行为&#xff0c;如何在 RocketMQ 中合理使用重试机制&#xff0c;帮助构建弹性&#xff0c;高可用系统的最佳实践。 RocketMQ 的重试机制…

[附源码]java毕业设计静谧空间自习室预订系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

服务器部署Vue2脚手架的PIXI游戏项目-知识点注意

文章目录安装PIXI框架方式一&#xff08;安装&#xff09;方式二&#xff08;引入&#xff09;javaScript代码位置initPixi方法组件挂载完毕后调用注意文件导入使用import一个个导入并命名使用setTimeout()方法使用一般方法调用表达式使用安装PIXI框架 方式一&#xff08;安装…

高通量筛选检测方法-分子篇

分子水平的筛选更多的是检测酶/受体功能的改变或探针/蛋白质结合的抑制&#xff0c;或是检测蛋白质-配体结合的结构、动力学和亲和度。 下面将介绍了荧光偏振、荧光共振能量转移、酶联免疫吸附、表面等离子共振和核磁共振技术几种方法。 ■ 荧光偏振 荧光偏振是一项在高通量筛…

2-STM32GPIO输入之按键

文章目录1-硬件设计1.1 按键消斗1.1.1 RS触发器1.1.2 电容滤波2 按键电路设计2.1 软件消斗2.2 硬件消斗2.3 检测原理2-软件设计2.1 软件消斗2.1.1原理2.1.2 编程要点2.1.3 步骤2.2 代码编写2.2.1 主程序2.2.2 按键初始化2.2.2 按键扫描本章讲述GPIO输入的应用&#xff0c;使用独…

第03章_用户与权限管理

第03章_用户与权限管理1 用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码1.7 MySQL8密码管理(了解)2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限3. 权限表3.1 user表3.2 db表3.…

【springboot】18、内置 Tomcat 配置和切换

文章目录基本介绍Tomcat配置切换其他Web服务总结基本介绍 SpringBoot 支持的 webServer有: Tomcat, Jetty, or Undertow&#xff0c;我们使用spring-boot-starter-web进行web开发时&#xff0c;默认使用的就是Tomcat&#xff0c;下面来说明一下tomcat的配置以及切换其他的Web服…

小啊呜产品读书笔记001:《邱岳的产品手记-05》第9讲 产品案例分析:Hopper的“人工智能” 第10讲 产品被抄袭了怎么办?

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-05》第9讲 产品案例分析&#xff1a;Hopper的“人工智能” & 第10讲 产品被抄袭了怎么办&#xff1f;一、今日阅读计划二、泛读&知识摘录1、09 讲 产品案例分析&#xff1a;Hopper的“人工智能”2、10 讲 产品被抄袭…

《机器学习实战》8.预测数值型数据:回归

目录 预测数值型数据&#xff1a;回归 1 利用线性回归找到最佳拟合直线 2 局部加权线性回归 3 示例&#xff1a;预测鲍鱼的年龄 4 缩减系数来“理解”数据 4.1 岭回归 4.2 lasso 4.3 前向逐步回归 5 权衡偏差与方差 6 示例&#xff1a;预测乐高玩具套装的价格 6.1 收…

数字化转型指南发布,官方明确这样做!

上周&#xff0c;工信部《中小企业数字化转型指南》&#xff08;以下简称《指南》&#xff09;一经发布&#xff0c;便获得了大量官方媒体的转发&#xff0c;成为了几乎所有制造人的关注所在。制造企业数字化转型的标准路径首次被标准化&#xff0c;并传递给了更多的中国制造企…

python可以考的资格认证有哪些?

前言 可以考虑用Python做一个博客&#xff0c;或者仿制一个微博&#xff0c;或者仿制一个视频网站&#xff0c;或者仿制一个购物网站。界面简单一些&#xff0c;但是基础功能好用就行。&#xff08;文末送读者福利&#xff09; 2.或者学习用Python在网上爬一些数据&#xff0…

就地执行Windows Server2022升级

项目初期背景:“微软Windows Server 2012/2012 R2将于2023年10月停止支持 微软今天发出提醒,Windows Server 2012 和 Windows Server 2012 R2 将于 2023 年 10 月终止支持,届时将不再发布补丁更新。由于外企公司比较注重信息安全,对所有服务器需要确保有补丁修复更新,以便保…

一些逻辑漏洞案例

逻辑漏洞的一些案例 某edu高校逻辑漏洞弱口令 已提交该校&#xff0c;已修复 注册登陆 寻找上传点&#xff0c;无果&#xff0c;后缀名不可控 找到另一个登陆点&#xff0c;尝试使用之前注册的账户登陆、爆破、均无果 在测试找回密码处&#xff0c;发送admin用户发现返回管理…