观察者设计模式

观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(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(具体主题)管理观察者列表并在天气(这里是温度)改变时通知它们。

TemperatureDisplayFan(具体观察者)实现了Observer接口,定义了如何在接收到温度更新时响应。

WeatherStationsetTemperature方法被调用时,它会更新温度并通知所有观察者,观察者随后根据更新的信息进行相应的操作。

运行结果:

TemperatureDisplay: Temperature changed to: 30.0
Fan turned on
TemperatureDisplay: Temperature changed to: 20.0
Fan turned off

Java编程--观察者(Observer)设计模式的更多相关文章

  1. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  2. C#委托与事件之观察者Observer设计模式

    前言    委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...

  3. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  4. Java编程的23种设计模式

    设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用. ...

  5. 设计模式 策略-Strategy,装饰-Decorator,观察者-Observer

    重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...

  6. 设计模式--观察者(Observer)

    GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all ...

  7. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  8. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  9. Java编程的逻辑 (54) - 剖析Collections - 设计模式

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  10. Java并发编程中的设计模式解析(二)一个单例的七种写法

    Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...

随机推荐

  1. linux安装spark

    1.首先在官网下载http://spark.apache.org/downloads.html, 选择与hadoop对应的版本,对应关系为:spark1.6.2--scala2.10:spark2.0 ...

  2. 使用必读-使用Iceberg数据湖需要注意的点

    一.开发注意事项 1.Iceberg选择合适的表版本 简述:Iceberg目前有两个表版本(V1和V2),根据数据选择合适的表版本. V1表只支持增量数据插入,适合做纯增量写入场景,如埋点数据. V2 ...

  3. DeepSeek-V3 解读:优化效率与规模

    DeepSeek-V3 是大语言模型(LLM)领域的一项变革性进展,为开源人工智能设定了新的标杆.作为一个拥有 6710 亿参数的专家混合(Mixture-of-Experts,MoE)模型,其中每个 ...

  4. ESP8266+AT指令,使用MQTT协议连接阿里云

    AT指令集 AT+CWMODE=1 AT+CWJAP="热点名","热点密码" AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com& ...

  5. Esp32s3(立创实战派)移植LVGL

    Esp32s3(立创实战派)移植LVGL 移植: 使用软件EEZ studio 创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能 根据屏幕像素调整画布为320*240 复制ui文件至工程 ...

  6. 八米云-ESXi虚拟机安装教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 准备阶段: 八米云启动U盘(制作方法可参看<制 ...

  7. Flink学习(十九) 容错机制

    主要内容: 一致性检查点(checkpoint) 从检查点恢复到状态 Flink检查点算法 保存点(savepoint) 一致性检查点(checkpoint) Flink故障恢复机制的核心,就是应用状 ...

  8. FastAPI路由:微服务架构下的路由艺术与工程实践 🌐

    title: FastAPI路由专家课:微服务架构下的路由艺术与工程实践 date: 2025/3/4 updated: 2025/3/4 author: cmdragon excerpt: 用API ...

  9. 针对N=p^rq分解之初探

    针对N=p^r*q分解之初探 论文地址:https://eprint.iacr.org/2015/399.pdf 题目:https://www.nssctf.cn/problem/2016 from ...

  10. 线上测试木舟物联网平台之如何通过HTTP网络组件接入设备

    一.概述 木舟 (Kayak) 是什么? 木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台.支持异步和响应式编程开发,功能包含了物模 ...