javascript设计模式——Publish/Subscribe
推荐阅读http://dev.housetrip.com/2014/09/15/decoupling-javascript-apps-using-pub-sub-pattern/
我们先引出问题的所在,这里使用一个订单系统:
在一个电子商务系统中,现在我们有订单模块,和信息模块两个主要模块,当下单成功时,我们用要发送订单信息的给客户。
下面是一个简单的解决办法,我们在一个类中调用另一个类的方法。
// 订单类,存储订单的所有变量和函数
function Order( goods ){
this.goods = goods;
}
Order.prototype = {
done: function(){
// 订单完成代码
this.sendSuccessMsg();
},
sendSuccessMsg: function(){
var message = new Message();
message.sendMsg(this.goods)
}
} // 消息类,具备各种消息功能函数
function Message(){}
Message.prototype = {
sendMsg: function( goods ){
alert("商品名:"+goods.name+"\n"+"价格:"+goods.price);
}
//其它信息模块的方法
}
var order = new Order({ name:"索尼耳机", price:100})
order.done() //弹出商品的信息
经过简单的分析代码,我们可以发现一些问题,首先,Order和Message紧耦合,一般来说,
当一个类进行的修改会需要另一个类的修改这就是耦合。在这里,比较直接的一个问题,当我们改改了Message类中的sendMsg方法的名字或者参数时,Order类中的相应函数名和参数也要跟着修改。
知道了这种方法的问题,下面我们就来看看如何用Publish/Subscribe模式改进这段代码.Publish/Subscribe模式是一种消息通信模式,信息发布一方叫发布者,信息的接收方叫订阅者。
下面是一个根据Publish/Subscribe模式的简易系统
var subpub = {};
(function( subpub ){
var list = {};
subpub.publish = function(topic,msg){
for(var i = 0; i<list[topic].length; i++) {
list[topic][i](msg);
}
}
subpub.subscribe = function( topic,listener){
if(!list[topic]) list[topic] = [];
list[topic].push(listener);
}
})( subpub ) // 测试
subpub.subscribe('foo', function(msg){
alert(msg);
});
subpub.publish('foo', 'Hello World!')
将这个事件管理小系统应用到之前的订单系统中,进行解耦。
function Order( goods ){
this.goods = goods;
}
Order.prototype = {
done: function(){
// 订单完成代码
this.sendSuccessMsg();
},
sendSuccessMsg: function(){
subpub.publish('order/done',this.goods);
}
}
function Message(){
subpub.subscribe('order/done',this.sendMsg);
}
Message.prototype = {
sendMsg: function( goods ){
alert("商品名:"+goods.name+"\n"+"价格:"+goods.price);
}
//其它信息模块的方法
}
var message = new Message();
var order = new Order({ name:"索尼耳机", price:100});
order.done() //弹出商品的信息
现在,我们发现Message和Order类不关心彼此是如何实现的。修改某个类中的函数也不用考虑是否会影响到另一个类,就比如我们想修改sendMsg的函数名,只需要对Message进行修改,不会影响到Order。我们唯一需要关心的一点知识保存的事件名。
总结一下,Publish/Subscribe模式是用特定的事件名将函数存放在一个列表之中,通过这个特定的事件名,我们可以在任意处调用函数,并传入参数。
他使得类与类之间的耦合度减少,尤其是当一个类需要调用好多个类中的方法。
javascript设计模式——Publish/Subscribe的更多相关文章
- Publish/Subscribe Pattern & Vanilla JavaScript
Publish/Subscribe Pattern & Vanilla JavaScript https://en.wikipedia.org/wiki/Publish–subscribe_p ...
- JavaScript设计模式与开发实践 - 观察者模式
概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...
- JavaScript设计模式之观察者模式(学习笔记)
设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...
- javaScript 设计模式系列之一:观察者模式
介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),一个目标对象管理所有相依于它的观察者对象.该模式中存在两个角色:观察者和被观察者.目标对象与观察者之间的抽象耦合关系能够单独扩展 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- JavaScript的学习--JavaScript设计模式的总结
这篇博客只是自己对设计模式的理解的备忘~ 看完了<JavaScript设计模式>这本书,一直没有写博客记录一下,最近抽出时间来重读了一下,就顺便记录一下~ 如果你只是想粗略了解一下Java ...
- 浅谈Javascript设计模式
什么是模式 模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题. 也就是说用来解决常见问题的可复用的解决方案. 常见的js设计模式 Constructor(构造器)模式 Construct ...
- RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe)
原文:RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
随机推荐
- Android应用程序组件Content Provider简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...
- Javascript进阶篇——(函数)笔记整理
这节是根据慕课网和JavaScript DOM编程艺术一书加起来做的笔记 什么是函数如果需要多次使用同一段代码,可以把它们封装成一个函数.函数(function)就是一组允许在你的代码里随时调用的语句 ...
- DWZ在APS.NET WebForm中的使用(一)
1.前言 在最近的项目开发中,使用到了前端框架DWZ.DWZ是一款较为优秀的后台管理界面框架,但官方发布的文档确实令人汗颜,简单几页了事,有点对自己的产品不负责任了.同时感谢网友石头的热心帮助,在我这 ...
- C# HTML转换为WORD
使用aspose.words仅需要4句代码,即可搞定. Document doc = new Document(); DocumentBuilder builder = new DocumentBui ...
- HDU 2157 - How many ways??
给图,图中任意可达的两点间步数为1 问从图中A点走到B点步数为k的有几条路 祭出离散数学图论那章中的 邻接矩阵A. 设S=Ak 则 S[a][b] 为 a到b,步数为k的不同路的条数 剩下的就是矩阵快 ...
- CDZSC_2015寒假新人(1)——基础 c
Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the wareho ...
- JAVA多线程下,获取递增的序列号
场景描述: 1,目前我们的系统可以简单归纳成MVC的架构模式 2,每个前端的请求过来,都会在C层开启事务,最后处理结束后,也在在C层关闭事务(实际是在C层的底层统一做了事务的开启和提交): ...
- MYSQL5.6数据库ZIP安装以及VS中使用注意事项
先挂资源,下载地址: http://download.softagency.net/MySQL/Downloads/. 找到MYSQL5.6,两个版本看系统而定我下的是64位的:http://down ...
- mutex 和 spinlock 对比
理论上: mutex和spinlock都是用于多进程/线程间访问公共资源时保持同步用的,只 是在lock失败的时候处理方式有所不同.首先,当一个thread 给一个mutex上锁失败的时候,threa ...
- CSS混合模式
前面的话 层叠上下文z-index只是解决两个元素覆盖,谁离用户更近的问题.而CSS混合模式,则是处理两个元素覆盖部分如何混合的问题.如果了解photoshop的话,对这种现象应该不陌生.CSS3 ...