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工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
随机推荐
- linux下创建idea的桌面快捷方式
!!!使用linux系统安装idea才会用到: 在桌面上,新建文件,命名为:idea.desktop , (或者在别的地方创建后再放到桌面) 使用 vim 编辑该文件(或者不新建,直接vi idea. ...
- postman获取时间戳并自动计算token
工作中时常要测试接口,公共请求参数包括id, timestamp, token, token = MD5(id + key + timestamp)并转大写. 每次用外部工具去获取时间戳并计算toke ...
- 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 如前所述,应用层AI开发压根不会去刻意关注大模型底层实现,多数时候也关注不了. 但我 ...
- Word中接入大模型教程
前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧. 今天分享一下昨天实践的在word中接入大模型的教程. 在word中接入大模型最简单的方式就是使用vba. ...
- Flink - [02] 安装部署(Standalone)
一.准备 1.角色规划 Flink Standalone 角色规划 节点名称 node01 node02 node03 master ○ worker ○ ○ zookeeper ○ ○ ...
- 使用cy7c68013调试mt9v011 ov7670 摄像头测试 icamera视频采集调试
使用cy7c68013调试mt9v011 ov7670 摄像头测试 icamera视频采集调试 采集底板选用cp601d,原理图参考icamera设计,使用cy7c68013a芯片设计,固件刷ic ...
- ZLMediaKit: 快速入门
目录 ZLMediaKit是什么 编译 安装依赖库 构建项目 问题处理 问题1: srtp 未找到, WebRTC 相关功能打开失败 问题2:依赖库问题 安装 配置和运行 问题处理 问题1: 无权限监 ...
- Elasticsearch搜索引擎学习笔记(五)
搜索功能 数据准备 1.自定义词库 慕课网 慕课 课网 慕 课 网 2.新建立索引shop 3.建立mappings POST /shop/_mapping (7.x之前的版本:/shop/_mapp ...
- [vue系列]-vue+vue-i18n+elementUI 国际化
前言 vue+vue-i18n实现多语言 本文主要内容 安装 多语言配置 element 内置语言国际化 踩到的坑以及解决方案 安装 npm install vue-i18n 配置 1.i18n.js ...
- wxpython 文件重命名报错提示os.rename WinError 2]系统找不到指定的文件‘
原因:重命名需要把文件路径带上 源码: for file in files: print(file) os.rename(file, file.replace(beforename, afternam ...