博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
发布/订阅模式
阅读量:7120 次
发布时间:2019-06-28

本文共 1613 字,大约阅读时间需要 5 分钟。

  hot3.png

前言:3天,3天,整整3天,才理解什么是观察者模式或者叫发布订阅模式(很抽象嘛... (╯‵□′)╯︵┻━┻ ... holy high !!!)

------------------------------

观察者模式:

  1. 一个或多个观察者对目标的状态感兴趣,它们通过将自己依附在目标对象上以便注册所感兴趣的内容。目标状态发生改变并且观察者可能对这些改变感兴趣,就会发生一个通知消息,调用每个观察者的更新方法。当观察者不再对目标状态感兴趣时,它们可以简单地将自己从中分离;--《JavaScript 设计模式 P43》(挺抽象... )

  2. 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一发布者(主题对象或目标对象),在发布者的状态发生变化时,会通知所有观察者对象

  3. 通常在JavaScript里,注重观察者模式是很有用的,我们会发现它一般使用一个被称为Publish/Subscribe模式(先订阅后发布)的变量来实现。(虽相似,但观察者模式发布/订阅模式还是有区别的)

------------------------------

生活中例子:

  1. "不要打电话给我,我会打电话给你"中, "我"是发布者(主题对象或目标对象),"你"是观察者

  2. "请留下你们的联系方式,有消息我会通知你"中,"你们"是观察者 ,"面试官"是发布者(主题对象或目标对象)。

应用场景:

  1. 观察者多;

  2. 发布者状态发生变化需要通知所有依附在本身的观察者。

代码例子:

  • 构建具备订阅发布退订完善功能的代理对象(Agent):

    000329_J4c3_437855.png

  • duangduangduang~ 目标对象(发布者)和观察者入场:

    000433_TZPU_437855.png

  • 是时候让tom和mm知道了:

    000829_JOuE_437855.png

------------------------------

优点:

  1. 支持简单的广播通信,自动通知所有已经订阅过的对象;

  2. 页面载入后发布者很容易与观察者存在一种动态关联,增加了灵活性;

  3. 发布者与观察者之间的抽象耦合关系能够单独扩展以及重用;

  4. 解耦解耦解耦

缺点:

  1. 当观察者本身出问题了,发布者(目标对象)不会知道;

  2. 观察者之间非常无视彼此的存在,并对发布者产生的成本视而不见;

  3. 由于观察者和发布者之间的动态关系,导致很难跟着依赖更新。

------------------------------

Pubsubz:

  • Github上的发布订阅模式极简版例子Pubsubz,个人觉得不是很适合用来学习理清楚概念((╯‵□′)╯︵┻━┻ ... 我就是在这里兜圈子兜了好久。。不过理解后看作者代码感觉写得忒好。)

  • 代码如下:地址()

    004719_YJtA_437855.png004838_L5eN_437855.png004905_YWaO_437855.png
  • 其中并没有看到我们前面说的观察者(可能不够形象),这个例子让我产生两个疑问:

  1. 到底哪个是观察者,哪个是发布者?

  2. 为什么用同一个pubsubz??

  1. 函数testSubscriber,它有个名字叫example1,它是观察者(这里要抽象些,把它当成一个东西看);

  2. pubsubz是发布者,发布了3个消息观察者(这里其实应该是发送给多个观察者的,如果上面再多几个观察者,而这里只举例了一个(函数testSubscriber),还以为那三条消息是3个观察者呢,所以才在这里徘徊了好久。。@_@)

  3. 在刚开始队发布订阅这种模式还不清楚,很容易看不明白为什么这么写,pubsubz到底和发布者观察者有什么关系?混着混着就搞不清楚了。这里的pubsubz和上面的agent类似,只是它只是一个能发布订阅的对象而已。(agent能完善其他对象让它们也有发布订阅功能,因为有make方法)

一句话总结:

  • 建立一个"代理"完善对象(让对象具有发布订阅功能),变身为发布者,达到能一次通知多个观察者的效果。("代理"本身也觉有发布定于功能)

说明:

  • 可能有些点还理解不到位,待补充~

  • 问:晕没?

  • 答:晕了~

  • @_@

转载于:https://my.oschina.net/Karon/blog/498402

你可能感兴趣的文章
52ABP视频学习
查看>>
oracle之 RA-00054: resource busy and acquire with NOWAIT specified or timeout expired
查看>>
UVALive3261 UVA1640 POJ2282 HDU1663 ZOJ2392 The Counting Problem【进制】
查看>>
eclipse 取消置顶
查看>>
更新整理本人所有博文中提供的代码与工具(C++,2013.11)
查看>>
【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码
查看>>
UDP:用户数据报
查看>>
ReadAndWriteBinaryFile
查看>>
Arcgis Engine 添加一个Symbol符号样式步骤
查看>>
kafka 控制台命令
查看>>
alpha冲刺10
查看>>
睡觉了~~
查看>>
【LeetCode】28 - Implement strStr()
查看>>
Node.js与Sails~Model数据模型
查看>>
基础才是重中之重~如何整理BLL与DAL层的文件
查看>>
[转]没有找到 MFC42D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。解决方法!...
查看>>
我再也不-或许永远不-用zend studio-受够了!
查看>>
软件工程(2019)第三次作业
查看>>
Java性能调优
查看>>
第 6 章 存储 - 039 - Data Volume 之 bind mount
查看>>