码迷,mamicode.com
首页 > 其他好文 > 详细

发布/订阅模式

时间:2015-08-28 02:32:40      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

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

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

观察者模式:

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

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

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

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

生活中例子:

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

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

应用场景:

  1. 观察者多;

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

代码例子:

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

    技术分享

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

    技术分享

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

    技术分享

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

优点:

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

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

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

  4. 解耦解耦解耦

缺点:

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

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

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

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

Pubsubz:

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

  • 代码如下:地址(https://github.com/addyosmani/pubsubz

  • 技术分享技术分享技术分享
  • 其中并没有看到我们前面说的观察者(可能不够形象),这个例子让我产生两个疑问:

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

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

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

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

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

说明:

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

  • 问:晕没?

  • 答:晕了~

  • @_@





发布/订阅模式

标签:

原文地址:http://my.oschina.net/Karon/blog/498402

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!