学习笔记-js发布/订阅模式的简单实现
2015-04-02 17:51
555 查看
Publish/Subscribe(发布/订阅模式):
在《Javascript设计模式》一书中,这两种模式还是有些区别的。书中原话如下:
* Observer模式要求希望接收到主题通知者的观察者必须订阅内容改变的事件
* Subscribe/Publish模式使用了一个主题/事件通道,这个通道介于订阅者和发布者之间。该事件系统允许 代码定义应用程序的特定事件,该事件可以传递自定义参数,自定义参数包含订阅者所需要的值。其目的是避免订阅者和发布者产生依赖关系。
与Observer模式不同之处在于它允许任何订阅者执行适当的事件处理程序来注册和接收发布者发出的通知。
好吧,不明觉厉。。。。。。以下是个人理解:
观察者模式中,目标对象负责维护观察者。发布/订阅模式中发布者不关心订阅者,只负责把消息丢出去就不管了。观察者模式中,观察者要提供一个接口,然后当目标对象发生改变时调用此接口使自身状态和目标状态保持一致。即所有的观察者都要有一个统一的接口(比如上文中写的update方法,大家的方法都要叫这个名字)。
发布/订阅模式中,订阅者事件的触发不是依靠这样一个接口,Publish和Subscribe就像是QQ空间发说说,Publish相当于发布者,发布特定的说说(这个消息一般包含名称和订阅者所需要的参数),只要是好友都可以看到此说说,Subscribe相当于好友,订阅了你的消息。也可以理解为订阅者监听的不是发布者,而是消息池,只要消息池里有它关心的消息,即触发事件,不管这个消息是谁发布过去的。发布者和订阅者是解耦的。
将以上代码copy到console里试试吧。
在《Javascript设计模式》一书中,这两种模式还是有些区别的。书中原话如下:
* Observer模式要求希望接收到主题通知者的观察者必须订阅内容改变的事件
* Subscribe/Publish模式使用了一个主题/事件通道,这个通道介于订阅者和发布者之间。该事件系统允许 代码定义应用程序的特定事件,该事件可以传递自定义参数,自定义参数包含订阅者所需要的值。其目的是避免订阅者和发布者产生依赖关系。
与Observer模式不同之处在于它允许任何订阅者执行适当的事件处理程序来注册和接收发布者发出的通知。
好吧,不明觉厉。。。。。。以下是个人理解:
观察者模式中,目标对象负责维护观察者。发布/订阅模式中发布者不关心订阅者,只负责把消息丢出去就不管了。观察者模式中,观察者要提供一个接口,然后当目标对象发生改变时调用此接口使自身状态和目标状态保持一致。即所有的观察者都要有一个统一的接口(比如上文中写的update方法,大家的方法都要叫这个名字)。
发布/订阅模式中,订阅者事件的触发不是依靠这样一个接口,Publish和Subscribe就像是QQ空间发说说,Publish相当于发布者,发布特定的说说(这个消息一般包含名称和订阅者所需要的参数),只要是好友都可以看到此说说,Subscribe相当于好友,订阅了你的消息。也可以理解为订阅者监听的不是发布者,而是消息池,只要消息池里有它关心的消息,即触发事件,不管这个消息是谁发布过去的。发布者和订阅者是解耦的。
var pubsub = (function(){ var q = {} topics = {}, subUid = -1; //发布消息 q.publish = function(topic, args) { if(!topics[topic]) {return;} var subs = topics[topic], len = subs.length; while(len--) { subs[len].func(topic, args); } return this; }; //订阅事件 q.subscribe = function(topic, func) { topics[topic] = topics[topic] ? topics[topic] : []; var token = (++subUid).toString(); topics[topic].push({ token : token, func : func }); return token; }; return q; //取消订阅就不写了,遍历topics,然后通过保存前面返回token,删除指定元素 })(); //触发的事件 var logmsg = function(topics, data) { console.log("logging:" + topics + ":" + data); } //监听指定的消息'msgName' var sub = pubsub.subscribe('msgName', logmsg); //发布消息'msgName' pubsub.publish('msgName', 'hello world'); //发布无人监听的消息'msgName1' pubsub.publish('anotherMsgName', 'me too!');
将以上代码copy到console里试试吧。
相关文章推荐
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- js发布——订阅模式的通用实现及取消订阅
- js设计模式之迭代器模式学习笔记--封装简单的数组迭代器
- 【学习笔记六】 - js中 创建对象的模式与继承 及 js中实现块级作用域和函数私有变量 《js高程》6-7笔记
- 学习笔记:体会简单工厂模式的美妙之计算器的实现
- JavaScript简单实现发布订阅模式
- 实现一个简单的订阅与发布模式的代码块,和redux
- node.js 学习笔记003 :使用superagent和cheerio实现简单网页爬虫
- Js实现订阅发布模式(让你的代码写得贼六)
- 分布式服务框架学习笔记8 ActiveMQ入门2 发布/订阅模式
- js设计模式中发布与订阅实现观察者模式例子
- node.js笔记之订阅发布设计模式
- Java for Web学习笔记(九一):消息和集群(6)利用websocket实现订阅和发布(下)
- 【学习笔记javascript设计模式与开发实践(发布--订阅模式)----8】
- 黑马程序员---OC学习笔记之简单的单例模式实现
- 设计模式学习笔记一 简单工厂策略模式实现销售策略的变更(一)
- 【学习笔记javascript设计模式与开发实践(发布--订阅模式)----8】
- Silverlight学习笔记一(理解一下机制,使用一下布局,实现一个简单的用户登录)
- 学习笔记:11种行为型设计模式简单对比
- 学习笔记:11种行为型设计模式简单对比