浅谈javascript之经典设计模式——观察者模式

观察者模式简介:

  观察者模式又被称为发布订阅模式。是一种一对多的依赖关系,也就是某一个对象(消息发布者)的状态发生改变时,其他的对象(订阅者)接收到消息后会自动执行各自的操作。

  该模式中涉及到的对象: 

    1.消息发布者(一个)
      1.1消息发布者首先会建立一个通知数组arr,用来存储订阅者信息对象(有订阅该消息的观察者obj以及obj对应操作的回调函数callback)
      1.2消息发布者角色职责:
      (1)制定订阅该消息的方法

      (2)制定取消订阅消息的放方法
      (3)消息发布
    2.订阅者(众多):订阅者触发某事件时,让消息发布者调用订阅方法(此时订阅者会[传入回调函数及订阅者对象自己],然后被加入到通知数组中)。

  画图简介:

代码详解:

  // 创建观察者模式

// 1.创建一个消息发布者对象pubSub

var pubSub = {

//1.1 创建订阅者信息数组

  subscriber: [],//存储订阅者信息的数组,包括订阅者和它的行为函数(回调函数)

// 1.2添加订阅的方法

  addSub: function(callback, obj) {

    this.subscriber.push({ctx: obj,cb: callback});//(将订阅者信息【订阅者和它的行为函数(回调函数)】以对象的形式添加到订阅者信息数组)

  },

//1.3取消订阅的方法(遍历订阅者信息数组,移除传入的订阅者信息)

  cancelSub:function (obj){

    for(var i = 0; i<this.subscriber.length; i++){

      if(this.subscriber[i].ctx === obj ){

        this.subscriber.splice(i,1);

        break;

      }

    }

  },

// 1.4发布消息(遍历,传递数据给每个订阅者对象,然后订阅者对象各自调用自己的行为函数)

  pub: function(data) {

    for(var i = 0; i < this.subscriber.length; i++) {

    // 发布消息的时候,消息发布者把消息(数据data传参给每个对象的回调函数,并调用该回调函数)

      this.subscriber[i].cb.call(this.subscriber[i].ctx, data);//注意:这里每个订阅者对象的回调函数在这里被调用的时候,回调函数本身内部的this指向被改变了(原本应该指向的是实例对象obj(订阅者,例如s1),在这里被指向了调用回调函数的this.subscriber[i]【也就是包含订阅者对象和它方法的外层对象】),所以这里需要借助call来改变回调函数this.subscriber[i].cb内部this的指向,让它指向this.subscriber[i].ctx,所以不能写成这种this.subscriber[i].cb(data);

    }

  }

};

   //2.订阅者订阅及取消

   //订阅

   document.querySelector("#btnBJ").onclick = function() {

    pubSub.addSub(fn, s3);//当点击订阅按钮的时候,消息发布者调用订阅方法

    this.disabled = true;//订阅按钮不可用

    document.querySelector("#btnBJcancel").disabled = false;//取消订阅按钮可用

  };

   //取消订阅

  document.querySelector("#btnBJcancel").onclick = function (){

    pubSub.cancelSub(s3);//点击取消订阅按钮的时候,消息发布者调用取消订阅方法

    this.disabled = true;

    document.querySelector("#btnBJ").disabled = false;

  }

时间: 2024-11-05 15:49:31

浅谈javascript之经典设计模式——观察者模式的相关文章

浅谈javascript单体【读javascript设计模式第五章节单体有感】

单体,整个运行环境就独有一份,最简单的一种单体就是一个把所有属性和方法都集中在一起的对象,区别于一般的字面量对象,一般字面量对象是对一个物体的描述,集合该物体所具有的一些属性和方法,而单体则包含更多的些逻辑在里面,单体的好处有,划分命名空间,如果用来作为网页包装器,可以使得页面所有变量都封装在一个对象里,大幅度减小网页里的全局变量, 代码如: common.js (function(wz){ $.extend({ init:function(){ var self = this; this.bi

浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的 一:类似继承,先上关键代码 function extend(subClass,supClass){ var fn = function(){}; fn.prototype = supClass.prototype; subClass.prototype = new fn(); subClass.prototype.constr

浅谈设计原则和设计模式

文章结构: 1.前言 2.设计原则       3.设计模式 3.1 创建型模式 3.2 结构型模式 3.3 行为型模式 前言 设计原则和设计模式旨在帮助我们设计出一个可复用.可扩展.可维护的应用. 设计原则:设计OR重构系统的指导方针. 设计模式:解决某类问题性质有效的方法. 设计原则和设计模式要实现的目标是:在需求变动或者系统升级时,尽可能少的改变代码,尽可能多的实现新的功能. 设计原则是设计模式的"背后的故事",要深入理解设计模式必先深入理解设计原则. 设计原则 1.开闭原则(O

浅谈 JavaScript 编程语言的编码规范

对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编码规范也往往被轻视,开发过程中修修补补,最终也就演变成为后续维护人员的恶梦.软件存在的长期价值直接与编码的质量成比例.编码规范能帮助我们降低编程中不必要的麻烦.而 JavaScript 代码是直接发送给客户浏览器的,直接与客户见面,编码的质量更应该受到关注. 本文浅谈 JavaScript 编程中关

《浅谈JavaScript系列》系列技术文章整理收藏

<浅谈JavaScript系列>系列技术文章整理收藏 1浅谈JavaScript中面向对象技术的模拟 2浅谈javascript函数劫持[转自xfocus]第1/3页 3浅谈javascript 面向对象编程 4老鱼 浅谈javascript面向对象编程 5浅谈javascript的数据类型检测 6浅谈Javascript嵌套函数及闭包 7根据一段代码浅谈Javascript闭包 8浅谈JavaScript编程语言的编码规范 9浅谈Javascript面向对象编程 10浅谈JavaScript

浅谈javascript函数劫持

http://www.xfocus.net/articles/200712/963.html 浅谈javascript函数劫持 文章提交:hkluoluo (luoluonet_at_hotmail.com) by luoluo on 2007-11-30 luoluonet_at_yahoo.cn http://www.ph4nt0m.org 一.概述 javascript函数劫持,也就是老外提到的javascript hijacking技术.最早还是和剑心同学讨论问题时偶然看到的一段代码,大

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

浅谈javascript的原型及原型链

浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为该函数创建一个prototype属性,指向该函数的原型对象.实例对象是不会拥有该属性的.默认情况下,该原型对象也会获得一个constructor属性,该属性包含一个指针,指向prototype属性所在的函数. Person.prototype.constructor===Person [[proto

浅谈JavaScript运行机制

浅谈JavaScript运行机制 ? 想要了解一门语言,最好的办法就是了解它的运行机制.掌握了运行机制,能够让我们在开发中少走许多弯路,写出高质量的代码.本文简单介绍什么是JavaScript的运行机制,给刚刚接触JavaScript的小白一个初步的了解,为将来打好基础. 一.JavaScript 代码运行分两个阶段: 1.预解析---把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 2.执行---从上到下执行(按照js运行机制) 二.JavaScript运行机制的特点 1.JavaS