观察者模式又叫发布订阅模式,它可以让多个观察者对象同时监听某一个主题对象,即在一个事件发生时,不同的对象迅速对其进行相应。就比如当又人闯红灯,不同的人对这件事迅速发起响应,当然这个比喻不太恰当,不过在团队开发中,每个人做自己不同的模块,那你在通过不去动其它人的代码或者说在不去看其他人的代码时怎么去将它们所要的事情做出来呢,这个时候就可以用da到观察者模式了。前面我们说过了单例对象,这里的观察者其实我们也可以只用一个对象,并且这个对象的功能不需要更改。

首先我们定义一个对象,这个对象包括3个方法,注册,发布,还有解除,注册就是把触发我事件的信号加载到数据对象中去,发布就是去触发这个信号,解除就是把某个事件从我的事件库中删除。

var mapleTao={
  message:{},
  //注册
  register:function(type,fn){
  if(this.message[type]){
    this.message[type].push(fn);
  }else{
    this.message[type]=[fn];
  }
  },
//发布
  fire:function(type,opt){
    if(!this.message[type]) return false;
    this.message[type].forEach(function(item){
      item(opt);
    });
  },
  //取消
  remove:function(type,fn){
    var i=this.message[type].indexOf(fn);
    if(!this.message[type]||i==-1) return false;
    this.message[type].splice(i,1);
  }
};

上述就是创建了一个观察者对象,接下来就是对其简单调用了。

(function(){
  var maple=function(){
    console.log("i am maple");
  }
  //注册事件introduce
  mapleTao.register("introduce",maple);
})();
(function(){
  var tao=function(){
    console.log("i am tao");
  }
  //注册事件introduce
  mapleTao.register("introduce",tao);
    setTimeout(function(){
  mapleTao.remove("introduce",tao); //introduce在事件库中去除tao
    mapleTao.fire("introduce");      //触发introduce信号 结果为i am maple
  },0)
})();

mapleTao.fire("introduce"); //触发introduce信号 结果为i am maple,i am tao

(function(){
  var maple=function(obj){ //对参数处理
    console.log("i am maple,i am "+obj.status);
  }
//注册事件status
  mapleTao.register("status",maple);
})();
(function(){
  var tao=function(obj){
    console.log("i am tao,i am "+obj.name);
}
//注册事件status
  mapleTao.register("status",tao);
})();

mapleTao.fire("status",{status:"working",name:"studying"}); //结果 i am maple,i am working   i am tao,i am studying

总的来说,观察者模式可以在一个对象发生变化时,其它对象自动更新。

浅谈js观察者模式的更多相关文章

  1. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  2. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  3. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  4. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  5. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  6. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

  7. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

  8. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  9. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

随机推荐

  1. Grails的redirect无法跳转时的一个可能原因

    由于controller的命名一般首字母大写,如Login 此时如 class LoginController { def index = { redirect(action:Login, param ...

  2. Python爬取17吉他网吉他谱

    最近学习吉他,一张一张保存吉他谱太麻烦,写个小程序下载吉他谱. 安装 BeautifulSoup,BeautifulSoup是一个解析HTML的库.pip install BeautifulSoup4 ...

  3. 使用WampServer 3.0

    在server上安装了WampServer 发现本地使用良好,但是无法从别的PC访问. 原因有二: 1.现象:输入连接无反应 原因:server本身用了80端口,所有WampServer我就设置了80 ...

  4. 九张图让你的PPT立刻高大上

  5. Spring+MyBatis实践—登录和权限控制

    1.实现用户登录功能: 通过session来实现用户登录功能.在用户登录时,将用户的相关信息放在HttpSession对象用,其中HttpSession对象可以通过HttpServletRequest ...

  6. 判断数据库表字段是否为null值,采用is null

    use UserCentergo select * from AccountDetails1.判断一个字段是否为null值,进行查询:update AccountDetails set Project ...

  7. 对加密方式(公钥私钥)的形象理解(以http和https为例)

    https其实就是建构在SSL/TLS之上的 http协议,所以要比较https比http多用多少服务器资源,主要看SSL/TLS本身消耗多少服务器资源. http使用TCP 三次握手建立连接,客户端 ...

  8. 145. Binary Tree Postorder Traversal

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given bina ...

  9. Spring事务传播机制

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...

  10. MapReduce架构设计

    MapReduce采用Master/Slave的架构,其架构图如下: 它主要有以下4个部分组成: 1)Client 2)JobTracker JobTracke负责资源监控和作业调度.JobTrack ...