观察者模式——JavaScript

观察者模式又被称为发布-订阅模型或消息机制。

基本思想是观察者一个静态(或全局)对象,为大家提供三个方法:发布、订阅、取消订阅。想得到消息的订阅者需要通过订阅某些消息,当发布者发布某些消息的时候对应的订阅者就收到消息了。订阅者也可以取消订阅。

 1 var Observer = (function(){
 2     var _messages = {};
 3     return {
 4         regist: function(type,fn) {   //订阅消息
 5             if(typeof _messages[type] === ‘undefined‘){
 6                 _messages[type] = [fn];
 7             } else {
 8                 _messages[type].push(fn);
 9             }
10         },
11         fire: function(type,args){     //发布消息
12             if(!_messages[type])
13                 return;
14             var events = {
15                 type: type,
16                 args: args;
17             };
18
19             _messages[type].forEach(function(item){
20                 item.call(this,events);  //这里的this不太明
21             });
22
23         },
24         remove: function(type,args){   //取消订阅
25             if(_messages[type] instanceof Array){
26                 _messages[type].lastIndexOf(fn) && _messages[type].splice(i,1);
27                 /*var i = _messages[type].length-1;
28                 for(; i>-1; i--){
29                     _messages[type][i] === fn && _messages[type].splice(i,1);
30                 }*/
31             }
32         }
33     }
34
35 })();

使用场景,用户在留言评论的同时用户消息栏也相应改变。这里订阅者是评论模块和消息模块,发布者是用户操作模块。

 1 //评论模块:
 2 (function(){
 3     Observer.regist(‘addCommentMessage‘,addMsg);
 4     Observer.regist(‘addCommentMessage‘,removeMsg);
 5     function addMsg(){
 6         //...
 7     }
 8     function removeMsg(){
 9         //...
10     }
11 })();
12
13 //消息模块
14 (function(){
15     Observer.regist(‘addCommentMessage‘,changeMsgNum);
16     Observer.regist(‘removeCommentMessage‘,changeMsgNum);
17     function changeMsgNum(){
18         //...
19     }
20 })();
21
22 //用户操作模块
23 (function(){
24     $("#submitBtn").onclick = function(){
25         //...
26         Observer.fire(‘addCommentMessage‘,{
27             text: text.value,
28             num: 1
29         });
30     };
31     $("#deleteBtn").onclick = function(){
32         //...
33         Observer.fire(‘removeCommentMessage‘,{
34             num: -1
35         });
36     };
37 })();

参考:

张容铭《JavaScript设计模式》

时间: 2024-08-04 18:31:55

观察者模式——JavaScript的相关文章

常用的Javascript设计模式-韩烨

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

《javascript 设计模式》 第15章 观察者模式 -- 学习笔记

定义: 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者 “publisher-subscriber" 模式) 是一种管理人与其任务之间的关系(确切的讲,是其对象及其行为和状态之间的关系 )的得力工具.用javascript的 话来说,这种模式的实质 就是你可以程序中某个对象的状态进行观察并且在其发生改变时能够得到通知. 观察者API: var Publisher=function(){ this.subscribers=[]; } //推送方法 Pub

【读书笔记】读《JavaScript设计模式》之观察者模式

一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象及其行为和状态之间的关系)的得力工具.用JavaScript的话来说,这种模式的实质就是你可以对程序中某个对象的状态进行观察,并且在其发生改变时能够得到通知. 二.例子 我们需要一个发布者的构造函数,它为该实例定义了一个类型为数组的属性,用来保存订阅者的引用. function Publisher(

《JavaScript设计模式与开发实践》读书笔记之观察者模式

1.<JavaScript设计模式与开发实践>读书笔记之观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观察者模式 以客户看房为例 首先指定谁充当发布者,如售楼处 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者.这里为了让订阅者只接收自己感兴趣的消息,增加一个标识key 最后发布消息时候,发布者遍历缓存列表,依次触发里面存放的订阅者的回

理解javascript观察者模式(订阅者与发布者)

什么是观察者模式? 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象.它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称. 理解观察者模式: JS传统事件就是一个观察者模式,之所以要有观察者模式,是因为有时候和传统事件无关的事件,比如:2个或者更多模块的直接通信问题,比如说我有

JavaScript设计模式与开发实践 – 观察者模式 http://web.jobbole.com/87809/

概述 观察者模式又叫发布 – 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做发布者).发布者的状态发生变化时就会通知所有的订阅者,使得它们能够自动更新自己. 观察者模式的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式. 观察者模式的中心思想就是促进松散耦合,一为时间上的解耦,二为对象之间的解耦.让耦合的

JavaScript设计模式之观察者模式(学习笔记)

设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切图.做少量交互效果的FE甚至可能不会用到,但是当你开始使用Angular/Backbone等框架的时候,就无法避免设计模式.MVC/MVVM这些东西了(反正我是伤脑筋). 我学设计模式是刚开始接触编程大概三个月的时候,看一本书<大话设计模式>,里面用C#语言来写,我很无语,因为强类型的编程语言对于

ruby和javascript的观察者模式

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现. 实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则.无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用. 观察者模式在ruby中的是实现 1 mo

javascript上的观察者模式

         观察者模式是众多软件设计模式中较为常用的一种模式.又称订阅发布模式.其主要原理是将多个观察者绑定在一个事件上,当一个事件触发时,通知绑定在上面的观察者,依次触发绑定的多个事件.         这个模式在基于MV*框架的开发中有广泛的应用,可以有效的将数据层(Model)和视图层(view)分割开,以及不同的视图之间分割开,避免页面之间过度耦合.下面是我的一个例子: <!-利用观察者模式,使三个块元素分别以不同方式隐藏 --> <html> <head>