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 抽象访问者: 抽象类…

IoTDI2019论文列表

day 1 session 1 IoT For Buildings 1. Anonymizing Building Data for Data Analytics in Cross-Organizational Settings (匿名化数字分析) Jens Hjort Schwee, Fisayo Caleb Sangogboye, Mikkel Baun Kjrgaard (University of Southern Denmar…

EWSN 2019 (待续)

整理了一些我感兴趣的论文 1. Improving the Timeliness of Bluetooth Low Energy in Noisy RF Environments (Best paper runup) Michael Spörk, Carlo Alberto Boano, Kay Römer (Graz University of Technology, Austria) 概要:处理了BLE在嘈杂环境中的抗…

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

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

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

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

SIGCOMM 一些有意思的论文

[SIGCOMM18] Networking Across Boundaries Enabling Wireless Communication through the Water-Air Interface. 主要内容:实现水陆通信。在空气中的主要传播手段是电磁波,在水下进行通信的主要设备是声纳,本论文实现水下声纳和空气中电磁…

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种设计模式之享元模式

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

Ubicomp一些有意思的论文

[Ubicomp2016] ARTcode: Preserve Art and Code In Any Image 主要内容:研究团队来自上海交通大学王新兵老师团队。主要成果是在图片中嵌入信息(不同于现在,在二维码中间放一张小小图片)。方法:给一张图片&#xff0c…

设计模式之创建类模式PK

创建类模式包括: 工厂方法模式建造者模式抽象工厂模式单例模式原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模…

设计模式之结构类模式PK

结构类模式包括: 适配器模式桥梁模式组合模式装饰模式门面模式享元模式代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更高层次的逻辑需求. 结构型模式是为解决怎样组装现有的类,设计他…

设计模式之行为类模式PK

行为类模式包括: 责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注如何管理对象的行为. 命令模式VS策略模式 策略模式和命令模式相似, 特别是命令模式…

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

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

设计模式之规格模式

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

低功耗广域网:关键特性

参考:《从创意到原型:物联网应用快速开发》 董玮 高艺 编著 介绍详细,适合初学无线网络和物联网的童鞋 —————————————————————————————————————— 低功耗广域网(LPWAN) 一.分…

设计模式之雇工模式

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

Grove-Lora Radio:修改库函数使能修改扩频因子、带宽参数、码率

Grove-Lora Radio的使用详见:http://wiki.seeedstudio.com/cn/Grove_LoRa_Radio/ 但是网站中提供的Grove_LoRa_433MHz_and_915MHz_RF-master中的示例代码只能修改RF的频率,不能修改LoRa扩频因子、带宽等参数。研究了一下午,终于搞明白怎么修…