观察者模式方法
   1.称之为消息机制或发布-订阅者模式
   2.定义了一种依赖关系解决了主体对象与观察者之间功能的耦合

观察者方法

        //将观察者放在闭包中,当页面加载就立即执行
var Observer = (function(){
var _messages = {};
return {
//注册信息接口
regist : function(type,fn){
//如果此消息不存在则应该创建一个该消息类型
if(typeof _messages[type] === 'undefined'){
_messages[type]=[fn];
//如果此消息存在
}else{
//将动作方法推入该消息对应的动作执行序列中
_messages[type].push(fn);
}
},
//发布信息接口
fire : function(type,args){
if(!_messages[type])
return;
//定义消息信息
var events = {
type : type,
args : args || {}
},
i=,
len = _messages[type].length;//消息动作长度
//遍历消息动作
for(;i<len;i++){
//依次执行注册的消息对应的动作序列
_messages[type][i].call(this,events);
}
},
//移除信息接口
remove : function(type,fn){
if(_messages[type] instanceof Array){
//从最后一个消息动作遍历
var i = _messages[type].length - ;
for(; i >=; i--){
//如果存在该动作则在消息动作序列中移除相应动作
_messages[type][i] === fn && _messages[type].splice(i,);
}
}
}
}
})();

对象间解耦:用在课堂上老师提问学生的例子说明一下

学生类Student:

            var Student = function(result){
var that=this;
that.result=result;
that.say=function(){
console.log(that.result);
}
}
Student.prototype.answer = function(question){
Observer.regist(question,this.say);//注册,接收到问题
}
Student.prototype.sleep = function(question){
Observer.remove(question,this.say);//移除,接收到问题,没有回答
}

老师类Teacher

            var Teacher = function(){};
Teacher.prototype.ask =function(question){
console.log('问题是:'+question);
Observer.fire(question);//问学生问题
}

实例化三个学生(订阅者)

             //实例化三个学生(订阅者)
var stu1=new Student("学生1回答什么是设计模式答案");
var stu2=new Student("学生2回答什么是设计模式答案")
var stu3=new Student("学生3回答简述观察者模式答案")

监听到老师的问题(订阅者监听发送者发送的信息)

             stu1.answer("什么是设计模式");
stu2.answer("什么是设计模式");
stu3.answer("简述观察者模式");

没有回答老师的问题(移除监听到发送者发送的信息)

             //没有回答老师的问题(移除监听到发送者发送的信息)
stu2.sleep("什么是设计模式");

实例化一个老师(发布者)

1             //实例化一个老师(发布者)
var teacher=new Teacher();

提问两个问题(把信息发送给学生)

             //提问两个问题(把信息发送给学生)
teacher.ask("什么是设计模式");
teacher.ask("简述观察者模式");

控制台显示结果

javascript-观察者模式的更多相关文章

  1. 轻松掌握:JavaScript观察者模式

    观察者模式 观察者模式也叫"订阅者/发布者"模式,定义对象间的一种一对多的依赖关系,发布者可以向所有订阅者发布消息. 观察者模式被广泛地应用于JavaScript客户端编程中.所有 ...

  2. JavaScript观察者模式

    观察者模式观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得 ...

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

    什么是观察者模式? 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象.它是由两类对象组成,主题和观察者 ...

  4. Javascript观察者模式(Object.defineProperty、Reflect和Proxy实现)

    什么是观察者模式? 答:在数据发生改变时,对应的处理函数自动执行.函数自动观察数据对象,一旦对象有变化,函数就会自动执行. 参考<原生JavaScript实现观察者模式>(https:// ...

  5. 《JavaScript 模式》知识点小抄本(下)

    介绍 最近开始给自己每周订个学习任务,学习结果反馈为一篇文章的输出,做好学习记录. 这一周(02.25-03.03)我定的目标是<JavaScript 模式>的第七章学习一遍,学习结果的反 ...

  6. JavaScript实现的发布/订阅(Pub/Sub)模式

    JavaScript实现的发布/订阅(Pub/Sub)模式 时间 2016-05-02 18:47:58  GiantMing's blog 原文  http://giantming.net/java ...

  7. 收藏的js学习小例子

    1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...

  8. observeMode

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  9. js设计模式之发布订阅模式

    1. 定义 发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知. 订阅者(Subscriber)把自己想订阅的事件注册(Subscri ...

  10. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

随机推荐

  1. C++基础知识

    基础知识 &&和||具有"短路"特性,特别是在第二个操作数有++或--时要注意. 显式类型转换 (类型说明符)表达式 //C风格的 类型说明符(表达式) //cpp ...

  2. 1Z0-053 争议题目解析486

    1Z0-053 争议题目解析486 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 486.You execute the following Recovery Manager (R ...

  3. C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

    在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...

  4. C#基础-邮件发送

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 说说&和&&的区别

    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true 时,整个运算结果才为true,否则,只要有一方为false,则结果为false. ...

  6. jquery完整弹窗代码

    </html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  7. linux 安装rz sz命令

    wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz tar zxvf lrzsz-0.12.20.tar.gz cd lrzsz-0.1 ...

  8. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  9. PHP运算符

    运算符 PHP运算符可以根据操作数的个数分为一元运算符.二元运算符.三元运算符.一元运算符例如!(取反运算符)或++(加一运算符),PHP支持的大多数运算符都是这种二元运算符,例如+.-.*./等算数 ...

  10. java web学习总结(十八) -------------------过滤器的高级使用

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...