【设计模式】发布-订阅模式

原创 lingwer111 随笔 JavaScript 201阅读 2017-05-16 10:44:46 举报

发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都将得到通知,在javascript开发中,我们一般用事件模型来代替传统的发布订阅模式

发布订阅模式可以直接使用一段代码。经过N的改进,下面是最终的代码
javascript 代码

下面是使用方法
html 代码

create()是一个防止命名冲突的命名空间,listen为订阅方。trigger是发布方。 上面例子中的add是方法名。订阅方和发布方通过这个方法名来相互联系。

发布-订阅模式应用在真实的例子 ---- 网站登录
加入我们在开发一个商场网站网站,网站里有header头部,nav导航,消息列表。购物车等模块。这几个模块渲染有有一个共同的前提条件。必须用ajax异步请求获取用户的登录信息。比如把用户名和头像显示在header模块里,而这两个字段都来着用户登录后的返回信息。
如果用传统的方式来实现,在ajax中success方法中编写如下面代码
javascript 代码

这段代码中,各个部分都产生了强耦合,如果需要增加一个刷新收货地址的功能,又不得不找到这段登录模块。在里面加上新功能的代码。
这时候,如果用发布订阅模式来编写,当登录成功后,登录模块只需要负责发布成功的消息,而业务方接受消息后,就会开始进行各自的业务。登录模式并不关心业务方究竟要干什么。也不想了解他们的内部细节。改善代码如下
html 代码

小结
发布—订阅模式在实际开发中非
常有用。
发布—订阅模式的优点非常明显,一为时间上的解耦,二为对象之间的解耦。它的应用非常广泛,既可以用在异步编程中,也可以帮助我们完成更松耦合的代码编写。
发布—订阅模式还可以用来帮助实现一些别的设计模式,比如中介者模式。 从架构上来看,无论是 MVC 还是 MVVM,都少不了发布—订阅模式的参与,而且 JavaScript 本身也是一门基于事件驱动的语言。
当然,发布—订阅模式也不是完全没有缺点。创建订阅者本身要消耗一定的时间和内存,而且当你订阅一个消息后,也许此消息最后都未发生,但这个订阅者会始终存在于内存中。
另外,发布—订阅模式虽然可以弱化对象之间的联系,但如果过度使用的话,对象和对象之间的必要联系也将被深埋在背后,会导致程序难以跟踪维护和理解。
特别是有多个发布者和订阅者嵌套到一起的时候,要跟踪一个 bug 不是件轻松的事情。

参考《JavaScript设计模式与开发实践》

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复