OBSERVER(观察者)-- 对象行为模式

  1. 意图:
    定义对象间地一种一对多地依赖关系,当一个对象地状态发生改变时,所有对于依赖于它的对象都得到通知并被自动更新。

  2. 别名:
    依赖(Dependents), 发布-订阅(Publish-Subsribe)

  3. 动机:
    将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维护一致性而是各类紧密耦合,这样降低了它们的可重用性。

  4. 适用性:
    在以下任一情况下可以使用观察者模式:
    a. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    b. 当一个对象必须通知其它对象,而它有不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。

  5. 结构:
    观察者模式结构图

  6. 参与者:
    a. Subject:
    目标知道它的观察者。可以有多个观察者观察同一个目标。
    提供注册和删除观察者对象的接口。
    b. Observer:
    为那些在目标发生改变时需获得通知的对象定义一个跟新接口。
    c. ConcreteSubject:
    将有关状态 存入各ConcreteObserver
    当它的状态发生改变时,向它的各个观察者发生通知。
    d. ConcreteObserver:
    维护一个指向ConcreteSubject对象的引用。
    存储有关状态,这些状态应与目标的状态保持一致。
    实现Observer的更新接口以使自身状态与目标的状态保持一致。

  7. 协作:
    观察者模式协作图

  8. 效果:
    a. 目标和观察者间的抽象耦合
    b. 支持广播通信
    c. 意外的更新

  9. 实现:
    a. 创建目标到其观察者之间的映射
    b. 观察多个目标
    c. 谁触发更新
    d. 对已删除目标悬挂引用
    e. 在发出通知前确保目标的状态自身是一致的
    f. 避免特定于观察者的更新协议–推/拉模式
    g. 显式地指定感兴趣的改变
    h. 封装复杂的更新语义
    i. 结合目标类和观察者

  10. 代码示例:

    public interface Observer {void update();}public interface Subject {void attach(Observer observer);void detach(Observer observer);void notify2();}public class ConcreteSubject implements Subject {private int state;private List<Observer> observers = new ArrayList<>();@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notify2() {for (Observer observer : observers) {observer.update();}}public int getState() {return state;}public void setState(int state) {this.state = state;notify2();}}public class ConcreteObserver implements Observer{private int observerState;private ConcreteSubject subject;public ConcreteObserver(ConcreteSubject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {observerState = subject.getState();System.out.println("Observer state update: " + observerState);}}public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();ConcreteObserver observer1 = new ConcreteObserver(subject);ConcreteObserver observer2 = new ConcreteObserver(subject);subject.setState(10);subject.setState(20);subject.detach(observer1);subject.detach(observer2);}}
  1. 已知应用:

  2. 相关模式:
    Mediator:通过封装复杂的更新语义,ChangeManager充当目标和观察者之间的中介者。
    Singleton: ChangeManager可使用Singleton模式来保证它是唯一的并且是可全局访问的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python及R语言绘制简易数据分析报告

Pytohn实现 在python中有很多包可以实现绘制数据分析报告的功能&#xff0c;推荐两个较为方便的包&#xff1a;pandas-profiling 和 sweetviz 。 使用 pandas-profiling 包&#xff08;功能全面&#xff09; 这个包的个别依赖包与机器学习的 sklearn 包的依赖包存在版本冲突&a…

【C++中的模板】

和你有关&#xff0c;观后无感................................................................................................................. 目录 前言 一、【模板的引入和介绍】 1、泛型编程 2、【模板的介绍】 二、【 函数模板】 2.1【模函数板的介绍】 1.…

修改word文件的创作者方法有哪些?如何修改文档的作者 这两个方法你一定要知道

在数字化时代&#xff0c;文件创作者的信息往往嵌入在文件的元数据中&#xff0c;这些元数据包括创作者的姓名、创建日期以及其他相关信息。然而&#xff0c;有时候我们可能需要修改这些创作者信息&#xff0c;出于隐私保护、版权调整或者其他实际需求。那么&#xff0c;有没有…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件&#xff1a;sql-analysis 一、背景二、源码简析三、总结 地址&#xff1a;https://github.com/jd-opensource/sql-analysis 一、背景 开发中&#xff0c;无疑会遇到慢SQL问题&#xff0c;而常见的处理思路都是等上线&#xff0c;然后由监控报警之后再去定位对应…

vue 前端读取Excel文件并解析

前端读取Excel文件并解析 前端如何解释Excel呢 平时项目中对于Excel的导入解析是很常见的功能&#xff0c;一般都是放在后端执行&#xff1b;但是也有特殊的情况&#xff0c;偶尔也有要求说前端执行解析&#xff0c;判空&#xff0c;校验等&#xff0c;最后组装成后端接口想要的…

【大数据】利用 Apache Ranger 管理 Amazon EMR 中的数据权限

利用 Apache Ranger 管理 Amazon EMR 中的数据权限 1.需求背景简介2.系统方案架构图3.主要服务和组件简介3.1 Amazon EMR3.2 Simple Active Directory3.3 Apache Ranger 4.部署步骤4.1 部署 Simple AD 服务4.2 部署 Apache Ranger4.3 部署 Amazon EMR4.4 在 Amazon EMR 的主节点…

【数据结构】二叉树(带图详解)

文章目录 1.树的概念1.2 树的结构孩子表示法孩子兄弟表示法 1.3 相关概念 2.二叉树的概念及结构2.1 二叉树的概念2.2 数据结构中的二叉树-五种形态2.3 特殊的二叉树2.4 二叉树的存储结构顺序存储链式存储 2.5 二叉树的性质 3. 堆3.1 堆的定义3.2 堆的实现堆的结构堆的插入向上调…

java技术栈快速复习02_前端基础知识总结

前端基础 经典三件套&#xff1a; html&#xff08;盒子&#xff09;css&#xff08;样式&#xff09;JavaScript&#xff08;js&#xff1a;让盒子动起来&#xff09; html & css HTML全称&#xff1a;Hyper Text Markup Language(超文本标记语言)&#xff0c;不是编程语…

不科学上网使用Hugging Face的Transformers库

参考 Program Synthesis with CodeGen — ROCm Blogs (amd.com) HF-Mirror - Huggingface 镜像站 https://huggingface.co/docs/transformers/v4.40.1/zh/installation#%E7%A6%BB%E7%BA%BF%E6%A8%A1%E5%BC%8F 准备 apt show rocm-libs -a pip install transformers python …

计算机网络—数据链路层

一、数据链路层的基本概念 结点&#xff1a;主机、路由器 链路&#xff1a;网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路 数据链路&#xff1a;网络中两个结点之间的逻辑通道&#xff0c;把实现控制数据协议的…

c++ 音、视频开发技术栈

C 音视频开发技术栈涉及多个关键组件和工具&#xff0c;以下是一个典型的技术栈概述&#xff1a; 编程语言与编译器&#xff1a; C&#xff1a;作为主要编程语言&#xff0c;C 提供了对底层硬件的高效访问和对性能的控制&#xff0c;使其成为音视频处理领域的理想选择。编译器…

ABAP 查找第二代增强

文章目录 ABAP 查找第二代增强第一种方法-根据包去查找第二种方法-通过MODX_FUNCTION_ACTIVE_CHECK重要的表MODSAP表TFDIR表TFTIT表 ABAP 查找第二代增强 第一种方法-根据包去查找 第二种方法-通过MODX_FUNCTION_ACTIVE_CHECK 第二代增强&#xff08;基于函数模块的增强&…

git如何将多个commit合并成一个?

我们使用git进行版本控制&#xff0c;在本地开发完某个功能时&#xff0c;需要提交commit&#xff0c;然后push至开发分支。简单的功能还好&#xff0c;几个commit可能就好了。但是如果功能比较复杂&#xff0c;commit多达十几甚至几十个时&#xff0c;commit管理就会很冗长。比…

【IC设计】CRC(循环冗余校验)

目录 理论解读CRC应用CRC算法参数解读常见CRC参数模型 设计实战校招编程题分类串行输入、并行计算、串行输出**串行计算、串行输出&#xff08;线性移位寄存器&#xff09;LSFR线性移位寄存器&#xff08;并转串&#xff09;(并行计算)模二除 总结——串行、并行计算的本质参考…

Java基础知识总结(82)

ConcurrentHashMap JDK 1.7中的ConcurrentHashMap 原理&#xff1a; JDK 1.7的ConcurrentHashMap的锁机制基于粒度更小的分段锁&#xff0c;分段锁其实是一种锁的设计&#xff0c;并不是具体的一种锁&#xff0c;对于ConcurrentHashMap而言&#xff0c;分段锁技术将Key分成一…

安卓手机APP开发__媒体开发部分__媒体投屏

安卓手机APP开发__媒体开发部分__媒体投屏 目录 概述 三个显示的表示形式 真实显示 虚拟显示 表面 前端服务的权限 概述 在安卓5&#xff08;API级别21&#xff09;引入的API android.media.projection 让你能够能够捕捉 到一个显示设备的内容&#xff0c;把它作为一个…

成功解决STM32-No ST-LINK detected问题!

本文目录 一、原因二、解决方法一&#xff1a;有复位按键方法二&#xff1a;没有复位按键 一、原因 在之前一直都用的好好的&#xff0c;突然出现这个问题&#xff0c;原因只有两个&#xff1a; 接线松了&#xff0c;或者杜邦线损坏&#xff0c;换新的线试一下。上一次下载到…

【AI赋能演示力】:纯新人食用指南!ChatPPT万字实测报告

引言 随着科技的日新月异&#xff0c;人工智能已经深入到我们工作生活的方方面面&#xff0c;尤其是在提高效率与创新设计方面发挥着越来越重要的作用。 追溯至2023年3月&#xff0c;一款名为ChatPPT的人工智能驱动的PPT设计工具震撼登场并开启公测&#xff0c;标志着办公智能…

【C语言--------文件操作】

一.文件的概念 为什么使用文件&#xff1f; 如果没有文件&#xff0c;我们写的程序数据是存储在电脑的内存中的&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据…

Ubuntu 18.0.4 安装 libc6 2.28 及公钥验证相关

今天打算在 window 11 上安装一个 OWT-Server 环境。照着网上的 OWT-Server 5.0编译与运行指南 通过 docker pull registry.cn-hangzhou.aliyuncs.com/wisefeng/owt-server:v5.0 安装了已打包好的 docker 文件&#xff08;即已执行了 ./scripts/pack.js -t all步骤&#xff09;…