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

设计模式简述(十五)观察者模式

观察者模式

  • 描述
    • 基本组件
      • 使用

描述

观察者模式,顾名思义就是一个对象观察着其他对象,一旦被观察的对象发生变化时,观察者对象也要做出相应动作。

其中,被观察者持有观察者的引用。由观察者主动注入被观察者内(有点像,观察者向被观察者内部安插的一个内应)

通常包含2个抽象角色及其对应的实现

需要注意的是,实际使用中观察链不宜过长,可能引发性能问题

基本组件

  • 定义观察者抽象及其实现
public interface IObserver {String getName();void action(IObservable observable, Object... params);
}public class DefaultObserver implements IObserver {private final String name;public DefaultObserver(String name) {this.name = name;}@Overridepublic String getName() {return this.name;}@Overridepublic void action(IObservable observable, Object... params) {System.out.println(this.getName() + " 观察到 ["+ observable.getName() +"] 的行为: " + Arrays.stream(params).map(String::valueOf).collect(Collectors.joining("; ")));}
}
  • 定义被观察者抽象及实现
public class DefaultObservable implements IObservable {private final String name;private Set<IObserver> observers = new HashSet<>();public DefaultObservable(String name) {this.name = name;}@Overridepublic void addObserver(IObserver observer) {observers.add(observer);}@Overridepublic void removeObserver(IObserver observer) {observers.remove(observer);}@Overridepublic void notifyObserver(Object... params) {observers.forEach(observer -> observer.action(this, params));}public String getName() {return name;}
}

使用

public class Sample {public static void main(String[] args) {IObserver observer1 = new DefaultObserver("观察员1");IObserver observer2 = new DefaultObserver("观察员2");IObservable observable = new DefaultObservable("张三");observable.addObserver(observer1);observable.addObserver(observer2);observable.notifyObserver("发生了事件...");}
}

相关文章:

  • 【Redis分布式】主从复制
  • 【网络服务器】——回声服务器(echo)
  • Linux 环境下 Mysql 5.7 数据定期备份
  • PCA主成分分析法(最大投影方差,最小重构距离,SVD角度)
  • 生物化学笔记:神经生物学概论06 听觉系统 结构与功能 声强范围的检测(外毛细胞动态调节)
  • 第二章 日志分析-apache日志分析(玄机系列)
  • STM32移植U8G2
  • WPF使用SQLSugar和Nlog
  • QT —— 信号和槽(带参数的信号和槽函数)
  • C++漫溯键值的长河:map set
  • IPD研学:76页页基于IPD思想-华为需求管理培训方案【附全文阅读】
  • 【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
  • [更新完毕]2025东三省A题深圳杯A题数学建模挑战赛数模思路代码文章教学:热弹性物理参数估计
  • 计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
  • 前端面试宝典---webpack原理解析,并有简化版源码
  • 突破传统!TTRL如何开启大模型无监督强化学习新篇章?
  • 使用Python和Pandas实现的Snowflake权限检查与SQL生成用于IT审计
  • windows电脑端SSH连接开termux的安卓端
  • 【经管数据】上市公司企业资本要素和劳动要素投入数据(2000-2022年)
  • Java大厂硬核面试:Flink流处理容错、Pomelo JVM调优、MyBatis二级缓存穿透防护与Kubernetes服务网格实战解析
  • 美“群聊泄密门”始作俑者沃尔兹将离职
  • 北部艳阳高照、南部下冰雹,五一长假首日上海天气很“热闹”
  • 空间站第八批科学实验样品返抵地球并交付科学家
  • 49:49白热化,美参议院对新关税政策产生巨大分歧
  • 学有质量、查有力度、改有成效,广大党员干部落实中央八项规定精神
  • 澎湃回声丨23岁小伙“被精神病”8年续:今日将被移出“重精”管理系统