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工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
随机推荐
- C++代码改造为UTF-8编码问题的总结
1. 引言 无论是哪个平台哪种编程语言,字符串乱码真是一个让人无语的问题:你说这个问题比较小吧,但是关键时刻来一下真是受不了.解决方式也有很多种,但是与其将编码转换来转换去,不如统一使用同一种编码方式 ...
- [计算机/硬件/GPU] 显卡
序 截至2025年,全球主流的AI大模型满血版的参数量均已突破百亿级,算力需求正以指数级飙升.特别是 DeepSeek 公司旗下的 R1 系列模型的问世,推动了很多中小企业部署私有化模型的需求. 然而 ...
- [WC2014] 紫荆花之恋 题解
啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...
- 安川机器人U轴减速机 HW9381465-C维修具体细节
安川机器人U轴减速机 HW9381465-C的维修是一个相对复杂的过程,涉及到多个部件的检查.维修和更换.以下是一些具体细节: 1.故障诊断: · 对安川机器人U轴减速机 HW9381465-C进行彻 ...
- ABB喷涂机器人控制柜维护保养
ABB喷涂机器人的管理与维护保养目的是减少机器人的故障率和停机时间,充分利用机器人这一生产要素,最大限度地提高产效率.喷涂机器人维修与保养在企业生产中尤为重要,直接影响到系统的寿命,必须精心维护. A ...
- elementUI中如何在Tabs标签页的标题文字后面添加文字或图标
1.效果如下: 实现代码如下:<el-tab-pane name="first"> <span slot="label"> <sp ...
- Flink学习(二) 应用场景和架构模型
实时计算最好的时代 在过去的十年里,面向数据时代的实时计算技术接踵而至.从我们最初认识的 Storm,再到 Spark 的异军突起,迅速占领了整个实时计算领域.直到 2019 年 1 月底,阿里巴巴内 ...
- wordpress设置自定义字体
wordpress设置自定义字体: 失败的操作过程: 写在最前:试了一天多的引用字体,方法包括但不限于: 下载.ttf..otf格式字体,转化为wotf .wotf2格式,挂在github仓库用CDN ...
- 解密prompt系列51. R1实验的一些细节讨论
DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还 ...
- python-argparse用法简介
1. argparse介绍 argparse是Python标准库中用于解析命令行参数的模块.它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数) 2. argpar ...