您的位置:首页 > 其它

发布/订阅模式

2015-08-28 01:00 232 查看
前言:3天,3天,整整3天,才理解什么是观察者模式或者叫发布订阅模式(很抽象嘛... (╯‵□′)╯︵┻━┻ ... holy high !!!)
------------------------------
观察者模式:
一个或多个观察者对目标的状态感兴趣,它们通过将自己依附在目标对象上以便注册所感兴趣的内容。目标状态发生改变并且观察者可能对这些改变感兴趣,就会发生一个通知消息,调用每个观察者的更新方法。当观察者不再对目标状态感兴趣时,它们可以简单地将自己从中分离;--《JavaScript 设计模式 P43》(挺抽象... )

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

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

------------------------------
生活中例子:
"不要打电话给我,我会打电话给你"中, "我"是发布者(主题对象或目标对象),"你"是观察者;

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

应用场景:
观察者多;

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

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



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



是时候让tom和mm知道了:



[b]------------------------------[/b]优点:支持简单的广播通信,自动通知所有已经订阅过的对象;
页面载入后发布者很容易与观察者存在一种动态关联,增加了灵活性;
发布者与观察者之间的抽象耦合关系能够单独扩展以及重用;
解耦解耦解耦。
缺点:当观察者本身出问题了,发布者(目标对象)不会知道;
观察者之间非常无视彼此的存在,并对发布者产生的成本视而不见;
由于观察者和发布者之间的动态关系,导致很难跟着依赖更新。
------------------------------
Pubsubz:
Github上的发布订阅模式极简版例子Pubsubz,个人觉得不是很适合用来学习理清楚概念((╯‵□′)╯︵┻━┻ ... 我就是在这里兜圈子兜了好久。。不过理解后看作者代码感觉写得忒好。)

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






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

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

为什么用同一个pubsubz??



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

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

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

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

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

问:晕没?

答:晕了~

@_@
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: