JavaScript中发布/订阅模式的简单实例
来源:互联网 发布:淘宝店如何找代理商 编辑:程序博客网 时间:2024/06/07 05:09
1.Observer模式要求希望接收到主题通知者的观察者必须订阅内容改变的事件。
2.Subscribe/Publish模式使用了一个主题/事件通道,这个通道介于订阅者和发布者之间。该事件系统允许代码定义应用程序的特定事件,该事件可以传递自定义参数,自定义参数包含订阅者所需要的值。其目的是避免订阅者和发布者产生依赖关系。
与Observer模式不同之处在于它允许任何订阅者执行适当的事件处理程序来注册和接收发布者发出的通知。
好吧,不明觉厉。下面是我的理解:
1.观察者模式中,目标对象负责维护观察者。发布/订阅模式中发布者不关心订阅者,只负责把消息丢出去就不管了。
2.观察者模式中,观察者要提供一个接口,然后当目标对象发生改变时调用此接口使自身状态和目标状态保持一致。即所有的观察者都要有一个统一的接口(比如上文中写的update方法,大家的方法都要叫这个名字)。而发布/订阅模式中,订阅者事件的触发不是依靠这样一个接口,而是订阅者通过监听一个特定的消息(这个消息一般包含名称和订阅者所需要的参数)来触发的。可以理解为订阅者监听的不是发布者,而是消息池,只要消息池里有它关心的消息,即触发事件,不管这个消息是谁发布过去的。发布者和订阅者是解耦的。
下面是js中发布/订阅模式的实现,复制粘贴到console里面试一试就明白了:
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!');
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!');
0 0
- JavaScript中发布/订阅模式的简单实例
- JavaScript发布/订阅实例
- javascript中的发布/订阅模式
- JavaScript之发布-订阅模式
- Javascript设计模式-发布/订阅模式最小化的示例
- javascript设计模式-(发布-订阅模式)
- JavaScript设计模式-发布订阅模式
- javascript 设计模式 发布订阅模式
- 学习笔记-js发布/订阅模式的简单实现
- Redis之订阅发布简单实例
- Sql Server2008 ServiceBroker发布/订阅模式实例
- 委托的订阅发布模式
- Dojo 的订阅/发布模式
- activeMq的发布订阅模式
- redis的发布/订阅模式
- ActiveMQ的发布订阅模式
- zeromq 的发布 订阅模式
- 用 JavaScript 实现发布/订阅模式
- SQL语言基础
- ConvertRGBToNV12 问题记录
- CXF动态客户端调用webservice实例
- Win7下Nginx的安装与配置
- AjaxAnyWhere在web中应用
- JavaScript中发布/订阅模式的简单实例
- 易语言学习第二十二课----寻找进程PID
- Python:类
- Character Sets and Collations
- Python脚本运行出现语法错误
- ORA-01704: 文字字符串过长
- 10032---HttpClient访问,需要用户名密码时
- MalformedByteSequenceException:3 字节的 UTF-8 序列的字节 3 无效。
- 《机器学习实战》Logisic回归算法(2)之从疝气病症预测病马的死亡率