Java编程--观察者(Observer)设计模式
观察者设计模式
观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系。这种模式经常用于实现事件处理系统。
观察者模式的关键组成部分:
Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察者状态变化的方法。
Observer(观察者):所有观察者需要实现的接口,定义了当主题状态改变时需要调用的更新方法。
ConcreteSubject(具体主题):实现Subject接口,当其状态改变时,会向所有的观察者发出通知。
ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。
示例实现
以下是一个简单的观察者模式示例,演示了一个简单的天气应用,其中
WeatherStation作为Subject,当天气更新时,它会通知所有注册的观察者。
/**
* Observer(观察者):所有观察者需要实现的接口,定义了当主题状态改变时需要调用的更新方法。
*/
interface Observer {
void update(float temperature);
}
/**
* Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察者状态变化的方法。
*/
interface Subject {
void addObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
/**
* ConcreteSubject(具体主题):实现Subject接口,当其状态改变时,会向所有的观察者发出通知。
*/
class WeatherStation implements Subject {
private final List<Observer> observers;
private float temperature;
public WeatherStation() {
this.observers = new ArrayList<>();
}
@Override
public void addObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature);
}
}
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
}
/**
* 温度显示器
* ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。
*/
class TemperatureDisplay implements Observer {
@Override
public void update(float temperature) {
System.out.println("TemperatureDisplay: Temperature changed to: " + temperature);
}
}
/**
* 风扇
* ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。
*/
class Fan implements Observer {
@Override
public void update(float temperature) {
if(temperature > 25) {
System.out.println("Fan turned on");
} else {
System.out.println("Fan turned off");
}
}
}
/**
* 测试观察者模式
*/
public class ObserverPatternDemo {
public static void main(String[] args) {
WeatherStation station = new WeatherStation();
TemperatureDisplay display = new TemperatureDisplay();
Fan fan = new Fan();
station.addObserver(display);
station.addObserver(fan);
station.setTemperature(30);
station.setTemperature(20);
}
}
解释:
WeatherStation(具体主题)管理观察者列表并在天气(这里是温度)改变时通知它们。
TemperatureDisplay 和 Fan(具体观察者)实现了Observer接口,定义了如何在接收到温度更新时响应。
当WeatherStation的setTemperature方法被调用时,它会更新温度并通知所有观察者,观察者随后根据更新的信息进行相应的操作。
运行结果:
TemperatureDisplay: Temperature changed to: 30.0
Fan turned on
TemperatureDisplay: Temperature changed to: 20.0
Fan turned off
Java编程--观察者(Observer)设计模式的更多相关文章
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- C#委托与事件之观察者Observer设计模式
前言 委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...
- Java编程的23种设计模式
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用. ...
- 设计模式 策略-Strategy,装饰-Decorator,观察者-Observer
重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...
- 设计模式--观察者(Observer)
GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- Java编程的逻辑 (54) - 剖析Collections - 设计模式
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Java并发编程中的设计模式解析(二)一个单例的七种写法
Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
随机推荐
- SQL注入之时间盲注
SQL注入之时间盲注 一.时间盲注原理 时间盲注技术的核心在于巧妙地运用数据库中的时间延迟函数(例如 MySQL 的 SLEEP() 函数或 PostgreSQL 的 PG_SLEEP() 函数)来验 ...
- 在flink消费一段时间kafka后,kafka-group的offset被重置了是怎么回事?
一.背景 腾讯Flink使用 KafkaSource API创建source端,源码中默认开启了checkpoint的时候提交offset 到kafka-broker.读取kafka数据写入到iceb ...
- ATT&CK实战系列(二)红日靶场2
拓扑图 导入虚拟机 网络配置 增加网卡 配置网卡 三台主机的密码均为1qaz@WSX,其中WEB在登录的时候需要切换用户de1ay登录 iP地址 DC PC 配置PC和WEB主机时,会弹框输入admi ...
- element vue 动态单选_VUE 动态构建混合数据Treeselect选择树,同时解决巨树问题
今天在项目中需要通过行政区域选择,然后选择该行政区域下面的景区,也就是要构建行政区划.景区两表数据表的树.全国的行政区域到县已经3500多了,再加上景区会有几万个点,这棵选择树不论是在后台还是在前台构 ...
- ABP登录返回错误次数、锁定时间
ABP默认登录返回错误结果时,不会显示错误次数.锁定时间.为了实现验证错误时返回错误次数.锁定时间,我们需要改造返回接口. 1.定位验证错误的地方: 修改部分代码 1 /// <summar ...
- vue+elementUI 表格操作按钮添加loading
前言 表格操作栏,某个操作需要异步请求才能做跳转等 方案 整个列表每行都加一个loading字段,不够优雅 利用$set方法 改变当前行当前按钮loading,可行(代码如下) //按钮 row.lo ...
- 130道基础OJ编程题之: 68~77
130道基础OJ编程题之: 68~77 @ 目录 130道基础OJ编程题之: 68~77 68:BC72 平均身高 69:BC74 HTTP状态码 70:BC75 数字三角形 71:BC76 公务员面 ...
- excel 文件提示已受损 解决方案
1.打开office excel 2.python 语言save 方法导致,将后缀改为.xls 3.用WPS打开
- Win10 非正常断电重启后出现长时间磁盘100%活动占用
老毛病,以往半个小时左右会正常,这次上电1s发现风扇被卡马上关机,在启动结果硬生生卡了1h:应该是触发了微软某些后台的某些服务进程,记录一下 可疑涉事进程记录: svchost:Win服务主进程,是层 ...
- 人工智能-A*算法-最优路径搜索实验
上次学会了<A*算法-八数码问题>,初步了解了A*算法的原理,本次再用A*算法完成一个最优路径搜索实验. 一.实验内容1. 设计自己的启发式函数.2. 在网格地图中,设计部分障碍物.3. ...