设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

56 | 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式

其他观察者模式的应用场景
生产者-消费者模型与观察者模式的区别和联系
观察者模式的广泛应用场景
设计模式的解耦作用
进程内 vs. 跨进程
同步阻塞 vs. 异步非阻塞
例子:P2P投资理财系统的用户注册成功后发放体验金
被观察者和观察者之间的解耦
观察者模式也称为发布订阅模式
跨进程
进程内
异步非阻塞
同步阻塞
当一个对象状态改变时,所有依赖对象都会自动收到通知
一对多的依赖关系
解决类或对象之间的交互问题
课堂讨论
重点回顾
基于不同应用场景的不同实现方式
原理及应用场景剖析
实现方式
定义
行为型设计模式
观察者模式

该思维导图由 AI 生成,仅供参考

我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。
行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
今天,我们学习第一个行为型设计模式,也是在实际的开发中用得比较多的一种模式:观察者模式。根据应用场景的不同,观察者模式会对应不同的代码实现方式:有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。今天我会重点讲解原理、实现、应用场景。下一节课,我会带你一块实现一个基于观察者模式的异步非阻塞的 EventBus,加深你对这个模式的理解。
话不多说,让我们正式开始今天的学习吧!

原理及应用场景剖析

观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

观察者模式是一种行为型设计模式,用于解决对象之间的交互问题。它通过定义一对多的依赖关系,当一个对象状态改变时,所有依赖的对象都会自动收到通知。本文详细介绍了观察者模式的原理、实现方式以及应用场景。观察者模式的灵活性和可扩展性使其成为实际开发中常用的设计模式之一。文章还探讨了观察者模式的不同实现方式,包括同步阻塞和异步非阻塞的实现方式,以及进程内和跨进程的实现方式。此外,文章提到了观察者模式的广泛应用场景,如邮件订阅、RSS Feeds等,以及基于消息队列的实现方式。观察者模式的应用不仅局限于代码层面的解耦,还涉及到架构层面的系统解耦,以及产品设计思路。总之,观察者模式通过解耦观察者和被观察者的代码,提高了代码的可扩展性和灵活性,适用于各种不同的应用场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(120)

  • 最新
  • 精选
  • Chris
    生产-消费模型 是不是可以算是 观察者模式的一种异步非阻塞的实现呢

    作者回复: 可以算是应用

    2020-08-01
    7
  • Laughing
    1. 生产消费应该是多对多的关系。 2. 消息通知、推送,应该都是基于这种设计模式应用而来的。

    作者回复: ������

    2020-11-20
    1
  • JerryZhu
    这个实际开发 真的超级超级常用! 希望大家都能吃透了

    作者回复: 哈哈,加油

    2020-11-14
  • 。。。。
    当我们需要添加新的观察者的时候,比如,用户注册成功之后,推送用户注册信息给大数据征信系统,基于观察者模式的代码实现,UserController 类的 register() 函数完全不需要修改,只需要再添加一个实现了 RegObserver 接口的类,并且通过 setRegObservers() 函数将它注册到 UserController 类中即可。这一段是怎么注册进来的,不是很明白

    作者回复: 没怎么看懂你的意思,你是说怎么注册观察者吗?调用setRegObservers函数来完成的。

    2020-07-14
    2
  • Sinclairs
    发布-订阅模型,是一对多的关系,可以以同步的方式实现,也可以以异步的方式实现。 生产-消费模型,是多对多的关系,一般以异步的方式实现 两者都可以达到解耦的作用
    2020-03-11
    3
    186
  • 小兵
    区别在于生产消费模型以异步形式实现,消费者之间存在竞争关系。发布订阅以同步或异步的方式实现,订阅者之间没有竞争关系。联系在于两者在流程上都有先后关系。
    2020-03-11
    4
    103
  • Jxin
    1.生产消费,一条消息只会被一个消费者消费(评论有人提多对多,确实是区别,但感觉有点误导)。发布订阅,一条消费可以被多个消费者共同消费。 2.两者都是行为模式,其实都是切分发布和消费这两个行为。就生产和发布这两个行为来说,只是换了名字,本质上是一样的。而消费和订阅,其实也都是消费消息,只是前者只能有一人来消费,后者是订阅的每个人都可以来消费。 3.状态机,状态流转的事件发布。(各种有状态业务线都可以用到)。
    2020-03-13
    4
    81
  • 一剑
    发布订阅和生产消费模型最大的区别在于:发布者(可观测对象)是知道订阅者(观察对象)的存在,因为它需要遍历订阅列表去发布事件;而生产消费模型因为有中间消息代理的存在,生产者和消费者完全不知道对方的存在,完全解耦!
    2020-03-15
    2
    75
  • Yeoman
    一路学来,看着下面的评论越来越少,终于跟上进度,继续加油。小争哥的栏目做的真的很好,干货满满,与看书感觉完全不同,关键是对读者的思想启发深远。
    2020-03-11
    5
    34
  • 忆水寒
    我负责的软件是一个网关软件,主要是协议转换并且与外部不同厂商的系统进行数据交换。 我目前采用分进程的方式,各个接口进程启动的时候会连接主进程,并在主进程进行注册。 主进程在有内容更新的时候会采用观察者模式群发给需要的接口进程。由接口进程去完成协议转换并发给外部厂商。
    2020-03-11
    2
    27
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部