23种设计模式之观察者模式

观察者模式的定义

定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法

其类图如下:

23种设计模式之观察者模式

 

其中的4个角色:

  1. Subject 被观察者: 定义被观察者必须实现的职责, 它必须能够动态的增加、取消被观察者. 它一般是抽象类或者实现类, 仅仅完成作为被观察者必须实现的职责: 管理观察者并通知观察者
  2. Observer 观察者: 观察者接收到消息后, 即进行 update 操作, 对接收到的信息进行处理
  3. ConcreteSubject 具体的被观察者: 定义被观察者自己的业务逻辑, 同时定义对哪些事件进行通知
  4. ConcreteObserver 具体的观察者: 每个观察者在接收到消息后的处理反应是不同的, 每个观察者有自己的业务逻辑

被观察者抽象类代码:

23种设计模式之观察者模式

 

具体被观察者代码:

23种设计模式之观察者模式

 

观察者接口代码:

23种设计模式之观察者模式

 

具体的观察者代码:

23种设计模式之观察者模式

 

场景类如下:

23种设计模式之观察者模式

 

观察者模式的应用

观察者模式的优点:

  1. 观察者和别观察者之间是抽象耦合. 如此设计, 不管是增加观察者还是被观察者都非常容易扩展
  2. 建立一套触发机制.

观察者模式的缺点:

观察者模式需要考虑并发效率和运行效率问题, 一个被观察者, 多个观察者, 开发和调试就会比较复杂, 而且在Java中消息的通知是顺序执行, 一个观察者卡壳, 会影响整体的执行效率. 在这种情况下, 一般考虑采用异步的方式

观察者模式的使用场景:

  1. 关联行为场景. 关联行为是可拆分的, 而不是"组合"关系
  2. 时间多级触发场景
  3. 跨系统的消息交换场景

观察者模式的注意事项

1.广播链的问题

一个观察者可以有双重身份, 既是观察者, 也是被观察者, 链一旦建立, 这个逻辑就比较复杂, 可维护性非常差. 根据经验建议, 在一个观察者模式中最多出现一个对象既是观察者也是被观察者, 也就是说消息最多转发一次, 这还是比较好控制的.

观察者模式和责任链模式的最大区别就是观察者广播链在传播的过程中消息是随时更改的, 它是由相邻的两个节点协商的消息结构; 而责任链模式在消息传递过程中基本上保持消息不可变, 如果要改变,也只是在 原有的消息上进行修正

2.异步处理问题

被观察者发生动作了, 观察者要做出回应, 如果观察者比较多, 而且处理时间比较长怎么办, 用异步呗, 异步处理就要考虑线程安全和队列的问题

观察者模式的扩展

1.Java 世界中的观察者模式

在Java中, java.util.Observable 实现了被观察者的功能, 被观察者直接继承即可, java.util.Observer 是观察者接口, 已经写好了

2.项目中真实的观察者模式

  1. 观察者和被观察者之间的消息沟通. 被观察者状态改变会触发观察者的一个行为, 同时会传递一个消息给观察者, 在实际中一般的做法是: 观察者中的update方法接受两个参数, 一个是被观察者, 一个是DTO(Data Transfer Object, 数据传输对象), DTO一般是一个纯洁的JavaBean, 由被观察者生成, 当然, 如果考虑到远程传输, 一般消息是XML格式传递
  2. 观察者响应方式. 如果观察者来不及相应, 被观察者的时间就会被拉长. 观察者如何快速响应呢? 有两个办法: 一是采用多线程技术, 也就是通常说的异步架构; 二是缓存技术.
  3. 被观察者尽量自己做主. 在设计的时候要考虑灵活性,否则会加重观察者的业务逻辑, 一般是这样做的, 对被观察者的业务逻辑 doSomething 方法实现重载, 如增加一个 doSomething(boolean isNotifyObs) 方法, 决定是否通知观察者, 而不是在消息到达观察者时才判断是否要消费

观察者模式在实际项目和生活中的例子:

  1. 文件系统. 比如, 在一个目录下新建立一个文件, 这个动作会同时通知目录管理器增加该目录, 并通知磁盘管理器减少1Kb的空间, 这里 "文件" 是一个被观察者, "目录管理器"和"磁盘管理器"则是观察者
  2. 猫鼠游戏. 夜里猫叫一声,家里老鼠撒腿就跑, 同时也吵醒了熟睡的主人, 这里"猫"就是被观察者, 老鼠和人则是观察者
  3. ATM取钱. 在ATM机器上取钱,多次输错密码, 卡被ATM吞掉, 吞卡动作发生时, 会触发哪些事件呢?第一, 摄像头连续快拍, 第二, 通知监控系统,吞卡发生, 第三, 初始化ATM机屏幕, 返回最初状态. 一般前两个动作都是通过观察者模式完成的, 最后一个动作是异常来完成的
  4. 广播收音机. 电台在广播, 可以打开一个收音机听, 也可以打开两个收音机来收听, 电台就是被观察者, 收音机就是观察者

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

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

相关文章

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…

二维码的纠错码原理及细节

参考文档: https://www.thonky.com/qr-code-tutorial/error-correction-coding 1. 消息多项式 消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64…

Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:htt…

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型:物联网应用快速开发》 董玮,高艺编著 详解蓝牙标准中的GFSK调制:https://blog.csdn.net/lovehua365/article/detai…

设计模式之空对象模式

空对象模式 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法. 举个简单的例子, 一个听动物叫声的模拟程序: 动物代码: 听叫声的人: 现在我们想, 能不能把 animal 的空值判断去掉呢?我们增…

UML类图基础说明

UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息,如下图所示: 当然, 类图也不一定每一次都长这样, 比如你只分析各个类之间的关系…

J-flash 烧写cc2538教程

1. 打开J-falsh,所示如下界面 2. 配置相关参数。 菜单栏 Options → Project settings。按照如下框图选择。 3. 打开要烧写的文件。File → Open data file,选择要烧写的文件(一般为hex或bin文件) 4. 连接板子。Target → Connec…

跳表

概述 线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率的问题呢? 跳表来了, 顾名思义, 跳表就是可以跳跃的表, 我简单画了张图: 在原来链表的基础上, 建立一个新的…

论文写作——用excel和ppt做好看的论文图

论文写作——用excel和ppt做好看的论文图Excel 作图PPT保存前言:用matlab或者python作图,门槛较高,熟悉比较难。用excel和ppt就比较容易上手了。最近的论文全用ppt和excel作图,看着也不赖,在此记录一下一般的方法。 co…