当前位置: 首页 > 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("发生了事件...");}
}
http://www.dtcms.com/a/167055.html

相关文章:

  • 【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服务网格实战解析
  • 博主勇闯自媒体
  • 图像加密算法概述
  • python2反编译部分
  • 油气人工地震资料信号处理中,机器学习和AI应用
  • 深入理解虚拟机与容器:原理、对比与应用场景分析
  • linux学习——数据库API创建
  • Nginx Proxy Manager 中文版安装部署
  • 【电脑维修】MERCURY水星无线网卡导致 Windows 网络适配器无法连接的一种情况
  • 【Linux】VSCode用法
  • 数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)