观察者模式方法
   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. html标签属性(attribute)和dom元素的属性(property)

    简介 attribute和property都有属性之意,但对于attribute和property的区分其实并不难.从对象来说,attribute是html文档上标签属性, 而property则是对应 ...

  2. SFC的OAM管理框架

    1.简介SFC Service Function Chain(SFC):一系列服务功能的顺序组合,主要是针对网络中的数据包/帧分类处理,还包括能够动态排序部署的网络功能并且这些网络功能间拓扑结构独立, ...

  3. JavaScript 中的相等检测

    一.有时JavaScript的等价比较是一件抓狂的事情,看看这个表格就一目了然了.

  4. Android之仿ele地图定位效果

    PS:最近项目要求,希望在选择地址的时候能够仿ele来实现定位效果.因此就去做了一下.不过ele使用高德地图实现的,我是用百度地图实现的.没办法,公司说用百度那就用百度的吧.个人觉得高德应该更加的精准 ...

  5. Apworks框架实战(三):单元测试与持续集成

    虽然这部分内容并没有过多地讨论Apworks框架的使用,但这部分内容非常重要,它与Apworks框架本身的设计紧密相关,也是进一步了解Apworks框架设计的必修课. 单元测试与持续集成概述 在敏捷开 ...

  6. 设计模式(三)工厂方法模式(Factory Pattern)

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  7. NoSQL

    Not Only Sql,弱一致性模型,非关系型.分布式.支持水平扩展的数据库设计模式,区别于传统关系型数据库严格的事务一致性和范式约束.分布式缓存是NoSQL一种实现形式. 参考:

  8. iOS阶段学习第33天笔记(自定义标签栏(UITabBar)介绍)

    iOS学习(UI)知识点整理 一.自定义标签栏 1.方法一 单个创建标签栏 #import "AppDelegate.h" #import "SecondViewCont ...

  9. html节点属性操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. EC笔记,第二部分:10.让=返回指向*this的引用

    Effective C++ 学习笔记 10 让=返回指向*this的引用 Table of Contents 1. 原因 2. 建议:在没有充分理由标新立异前,最好的做法是遵从传统. –by SkyF ...