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

别名

依赖,发布-订阅(publish - subscribe)

意图

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

主要解决的问题

一个对象状态改变给其他对象通知的问题,而且 要考虑到易用和低耦合,保证高度的协作。

如何解决

使用面向对象技术,可以将这种依赖关系弱化

这个模式的关键对象是目标(subject)观察者(observer)。一个目标可以有任意数目的依赖于它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态于目标的状态同步。

这种交互也叫做发布 - 订阅(publish - subscribe)。目标是通知的发布者,它发出的通知并不知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知

适用性

在以下情况可以使用观察者模式:

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者分装在独立的对象中,以使它们可以各自独立的改变和复用。
  • 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
  • 一个对象必须通知其他对象,而它又不能假定其对象是谁,换言之,不希望这些对象是紧密耦合的。

参与者

  • Subject(目标)

目标知道他的观察者,可以有任意多个观察者观察同一个目标

提供注册和删除观察者对象的接口

  • Observer(观察者)

为那些在目标发生改变时需要获得通知的对象的定义的一个更新接口

  • ConcreteSubject(具体目标)

将有关状态存入各ConcreteSuject对象

当它的状态发生改变时,向其各个观察者发出通知

  • ConcreteObserver(具体观察者)

维护一个指向ConcreteSubject对象的引用

存储有关状态,这些状态应与目标的状态保持一致

实现Observer的更新接口,以使自身状态与目标的状态保持一致

经典结构图

代码实现

目标及具体目标:



观察者及具体观察者:

这里Subject维护了一个list作为存储所有观察者的容器(以空间换时间),每当调用notify操作就会便利list中的Observer对象,并广播通知(调用Observer的Update操作),

行为模式 -- 观察者模式(Observer)的更多相关文章

  1. 行为型模式 - 观察者模式Observer

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 有一个大佬视频中提过一个案例,我觉得很棒:遥闻深巷中犬吠,边有妇人惊觉欠伸,其夫呓语.继而儿醒,大啼.夫亦醒. 模式的定义与特点 ...

  2. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  3. 行为型模式之Observer模式

    观察者模式(又被称为发布-订阅模式.模型-视图模式.源-收听者模式或从属者模式) 观察者模式中,一个目标对象管理所有依赖于它的观察者对象,并且在它本身的状态改变时主动发出通知. 应用场景 拍卖会可以认 ...

  4. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  5. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  6. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  7. Java 设计模式系列(十五)观察者模式(Observer)

    Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...

  8. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  9. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

  10. 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event

    观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...

随机推荐

  1. Java8 stream sorted排序时包括null

    开发过程中对象集合根据某个属性排序是常常遇到的情况,但有时排序会遇到对应属性值为null的情况,会报空指针异常. 查找stream.sorted源码看到有Comparator.nullsFirst和C ...

  2. DeepSeek引发创业的思考

    2025年春节最火的就是DeepSeek,就像08年小沈阳的火一样,越来越多的不是Ai这个行业的人开始越来越关注Ai,作为一个一直从事Ai的工作者,看到了ChatGPT的涌现后,中国再次冲出来的中国式 ...

  3. 搭建本地NCBI病毒库用于Blast

    搭建本地NCBI病毒库用于Blast 目的:为了通过Blast剔除我数据集中所有与Human任意片段相似度超过97%的序列 日期:2022/11/17 1. Nt库下载 创建conda环境 conda ...

  4. python os.walk函数

    os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. root 所指的是当前正在遍历的这个文件夹的本身的地址 dirs 是一个 list ,内容是该文件夹中所有的目录的名 ...

  5. 【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】

    ![量子镜像跃迁示意图]( 摘要:当构建产物需要穿越多维宇宙时,当Docker镜像要同时存在于72个平行世界--这就是镜像推送的量子艺术.本文记录一个未来AI如何通过Harbor建立镜像星门,让每个构 ...

  6. 【BUG】鸿蒙模拟器虚拟化问题的解决方案

    创建记事本文档.txt,键入以下代码: pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum > ...

  7. php接收json数据

    写php这么些年了,好多知识点都没有总结,来记录一下.毕竟日拱一卒无有尽,功不唐捐终入海. 用php来做APP的接口开发,但是在用postman模拟提交数据的时候$_POST.$_REQUEST都获取 ...

  8. go time时间格式化

    时间戳与时间格式相互转化 例一 // 时间戳转时间 str_time := time.Unix(1617279282,0).Format("2006-01-02 15:04:05" ...

  9. EmlBuilder:一款超轻量级的EML格式电子邮件阅读和编辑工具

    EmlBuilder 是一款超轻量级的电子邮件阅读和编辑工具,针对EML格式的文件具有非常强大的解析和容错能力,可实现超文本邮件的编写,并具备内嵌图片的编辑功能.该工具内部使用EmlParse对电子邮 ...

  10. linux 查看jdk安装路径

    [root@iz2ze9ufq5ehrayz6j88saz bin]# java -version java version "1.8.0_191" Java(TM) SE Run ...