当前位置: 首页 > 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.xdnf.cn/news/243307.html

相关文章:

  • OpenGL-ES 学习(15) ----纹理
  • x86_64 Linux使用avx指令(补充)
  • RISC-V AIA SPEC学习(四)
  • python如何把pdf转word
  • (33)VTK C++开发示例 ---图片转3D
  • Lucene多种数据类型使用说明
  • 文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)
  • 段永平浙大访谈精华:长期主义的知行合一
  • 类成员函数编译链接的过程
  • Spark-小练试刀
  • centos7 离线安装python3 保留python2
  • 华为eNSP:多区域集成IS-IS
  • 数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)
  • Linux btop 使用教程
  • 三元运算符与扩展运算符
  • Java 中的 CopyOnWriteArrayList
  • 11.多边形的三角剖分 (Triangulation) : 画廊问题
  • Postgresql源码(145)优化器nestloop参数化路径评估不准问题分析
  • WSGI(Web Server Gateway Interface)服务器
  • Seata服务端同步提交事务核心源码解析
  • MySQL零基础入门:Ubuntu环境安装与操作精解
  • 深度探索DeepSeek:从架构设计到性能优化的实战指南
  • WPF嵌入webapi服务器,充当微服务角色
  • ActiveMQ 性能优化与网络配置实战(二)
  • 使用Python和Pandas实现的Snowflake权限检查与SQL生成用于IT审计
  • 利用无事务方式插入数据库解决并发插入问题
  • windows系统搭建自己的ftp服务器,保姆级教程(用户验证+无验证)
  • OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】
  • 深度学习基础--目标检测入门简介
  • PHP之CURL通过header传参数及接收