当前位置: 首页 > news >正文

设计模式之:观察者模式

观察者模式简介

观察者模式是一种行为设计模式,定义对象间的一对多依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会自动收到通知并更新。

核心角色

  1. Subject(主题):维护观察者列表,提供注册、删除和通知观察者的方法。
  2. Observer(观察者):定义更新接口,供主题通知时调用。
  3. ConcreteSubject(具体主题):实现主题接口,存储具体状态,状态改变时通知观察者。
  4. ConcreteObserver(具体观察者):实现观察者接口,处理主题传递的状态更新。

Java实现示例

主题接口与具体主题
import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 具体主题
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyObservers(); // 状态变更时通知观察者}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(state);}}
}

观察者接口与具体观察者
// 观察者接口
interface Observer {void update(int state);
}// 具体观察者A
class ConcreteObserverA implements Observer {@Overridepublic void update(int state) {System.out.println("ObserverA: Subject's state updated to " + state);}
}// 具体观察者B
class ConcreteObserverB implements Observer {@Overridepublic void update(int state) {System.out.println("ObserverB: Subject's state updated to " + state);}
}

使用示例
public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observerA = new ConcreteObserverA();Observer observerB = new ConcreteObserverB();subject.registerObserver(observerA);subject.registerObserver(observerB);subject.setState(10); // 触发通知subject.setState(20); // 再次触发通知}
}

Java内置支持

Java提供了java.util.Observable类和java.util.Observer接口,但已过时(Java 9标记为废弃),推荐自行实现或使用第三方库(如Guava的EventBus)。

应用场景

  1. 事件驱动系统(如GUI按钮点击)。
  2. 消息队列或发布-订阅模型。
  3. 数据变化触发多组件更新(如MVC架构)。

优缺点

  • 优点:解耦主题与观察者,支持动态添加/删除观察者。
  • 缺点:过度使用可能导致复杂性,需注意避免循环依赖。

文章转载自:

http://bbp7hyLx.jmspy.cn
http://a2WIxQPf.jmspy.cn
http://1fDUPcSd.jmspy.cn
http://FZcsFJbL.jmspy.cn
http://ZAIeNtJ7.jmspy.cn
http://Hf0ec8Ts.jmspy.cn
http://H9il8HiW.jmspy.cn
http://PsrCZa2b.jmspy.cn
http://5Nn5rSEA.jmspy.cn
http://mN08v4ar.jmspy.cn
http://NDR2CTN6.jmspy.cn
http://yEsWMSTA.jmspy.cn
http://sBuwytTT.jmspy.cn
http://fUslfZA4.jmspy.cn
http://XXMJJzwF.jmspy.cn
http://alEDysNT.jmspy.cn
http://VPpbSVDq.jmspy.cn
http://Exq3hfRp.jmspy.cn
http://k76rju9E.jmspy.cn
http://2ic1f40z.jmspy.cn
http://MSfFuP4U.jmspy.cn
http://nybOwjCq.jmspy.cn
http://eK7jkKjm.jmspy.cn
http://MNvZRohn.jmspy.cn
http://wfo0JOdc.jmspy.cn
http://S4WQzbi0.jmspy.cn
http://SzGEB8q8.jmspy.cn
http://tgUl8kYU.jmspy.cn
http://sSVqBCYU.jmspy.cn
http://NKBqlfTr.jmspy.cn
http://www.dtcms.com/a/385941.html

相关文章:

  • 【pycharm】ubuntu24.04 安装配置index-tts及webdemo快速上手
  • Java 设计模式——观察者模式:从 4 种写法到 SpringBoot 进阶
  • “光敏” 黑科技:杜绝手机二维码读取时的 NFC 误触
  • AIGC(生成式AI)试用 36 -- shell脚本(辅助生成)
  • 【计算机网络 | 第17篇】DNS资源记录和报文
  • Flowise安全外网访问指南:基于cpolar的隧道配置详解
  • MySQL OCP认证[特殊字符]Oracle OCP认证
  • Springboot使用Freemark模板生成XML数据
  • 【数据工程】 10. 半结构化数据与 NoSQL 数据库
  • HarmonyOS应用开发:深入ArkUI声明式开发与性能优化实践
  • Vue: 组件注册
  • 408考研计算机网络第38题真题解析(2024)
  • Uni-app 生命周期全解析
  • JavaEE开发技术(第一章:Servlet基础)
  • 【数据结构】跳表
  • 设计模式-桥接模式02
  • Linux 基础命令详解与学习笔记
  • 设计模式(C++)详解——桥接模式(2)
  • 鹧鸪云光储流程系统:以智能仓储管理,驱动项目高效协同
  • DIY Linux 桌面:WiFi 管理器
  • 从 Pump.fun「直播」看热点币的生与死
  • 《算法闯关指南:优选算法-双指针》--05有效三角形的个数,06查找总价值为目标值的两个商品
  • Java List 详解:从基础到进阶的全面指南
  • 【问题】自启动的容器在开机重启后 都退出了,未能正常启动
  • 苹果手机上有没有可以定时提醒做事的工具
  • blender多个动作导入到unity
  • 通过adb dump activity的configChanges配置
  • 智能语音机器人如何提升语音交互机器人的交互能力?
  • 一文读懂Docker:从入门到实践
  • 控制IP端口访问的方法