当前位置: 首页 > news >正文

Javascript设计模式学习之Observer(观察者)模式

一个对象(subject)维持一系列依赖于它(观察者)的对象,将有关状态的任何变更自动通知给它们。

  • 当一个目标需要告诉观察者发生了什么有趣的事情,它会向观察者广播一个通知

  • 当我们不再希望某个特定的观察者获取其注册目标发出的改变通知时,该目标可以将它从观察者列表中删除。

  • Observer(观察者)模式列表组件

    • Subject(目标): 维护一系列观察者,方便添加或删除观察者

    • Observer(观察者): 为那些在目标状态发生改变时需获得通知的对象提供一个更新接口

    • ConcreteSubject(具体目标):状态发生改变时,向Observer发出通知,存储ConcreteObserver的状态

    • ConcreteObserver(具体观察者):存储一个指向ConcreteSubject的更新接口,实现Observer的更新接口,以使自身状态与目标的状态保持一致。

1. 观察者模式的实现

1.1 模拟拥有的一系列依赖Observer

function ObserverList(){
   this.observerList = [];
}
ObserverList.prototype.Add = function(obj){
   return this.observerList.push(obj);
};
ObserverList.prototype.Remove = function(obj){
   return this.observerList.pop(obj);
};
ObserverList.prototype.Empty = function(){
   this.observerList = [];
};
ObserverList.prototype.Count = function(){
   return this.observerList.length;
};
ObserverList.prototype.Get = function(index){
   if(index > -1 && index < this.observerList.length){
      return this.observerList[index];
   }
};
ObserverList.prototype.Insert = function(obj,index){
   var pointer = -1;
   if(index === 0){
      this.observerList.unshift(obj);
      pointer = index;
   }else if(index === this.observerList.length){
      this.observerList.push(obj);
      pointer = index;
   }
   return pointer;
};
ObserverList.prototype.IndexOf = function(obj,startIndex){
   var i = startIndex,
       pointer = -1;
   while(i < this.observerList.length){
       if(this.observerList[i] === obj){
          pointer = i;
       }
       i++;
   }
   return pointer;
};
ObserverList.prototype.RemoveIndexAt = function(index){
   if(index === 0){
     this.observerList.shift();
   }else if(index === this.observerList.length - 1){
     this.observerList.pop();
   }
};
//使用extension扩展对象
function extend(obj,extension){
   for(var key in obj){
       extension[key] = obj[key];
   }
};
var liuyidi = {};
var observer = new ObserverList();
extend(observer,liuyidi);
console.log(liuyidi);

1.2 模拟目标(Subject)和在观察者列表上添加、删除或通知观察者

function Subject(){
   this.observers = new ObserverList();
}

Subject.prototype.AddObserver = function(observer){
   this.observers.Add(observer);
};

Subject.prototype.RemoveObserver = function(observer){
   this.observers.RemoveIndexAt(this.observers.IndexOf(observer,0));
};

Subject.prototype.Notify = function(context){
   var observerCount = this.observers.Count();
   for(var i = 0; i < observerCount; i++){
      this.observers.Get(i).Update(context);
   }
};

相关文章:

  • python用sybase自带的sybpydb模块访问数据库
  • 三种对象传参和ModelDriven的原理
  • netty demo
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • 解决tomcat6部署spring4+mybatisJSP页面产生的500错误,控制台报java.lang.NullPointerException的问题...
  • SQL Server中查看哪些游标未释放
  • 【抄】更改eclipse配置
  • 胜利大逃亡(续)
  • 理解JavaScript中的回调函数
  • hdu 5640 King's Cake(模拟)
  • 2、Python语法基础
  • Python基础教程第二版 6:抽象
  • UnicodeEncodeError: 'ascii' codec can't encode
  • 【Android 学习】 Android反编译
  • 【转】Java 中的 i = i++
  • 【Leetcode】101. 对称二叉树
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译]CSS 居中(Center)方法大合集
  • C学习-枚举(九)
  • exports和module.exports
  • SAP云平台里Global Account和Sub Account的关系
  • Theano - 导数
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • webpack入门学习手记(二)
  • Web设计流程优化:网页效果图设计新思路
  • Yeoman_Bower_Grunt
  • 程序员最讨厌的9句话,你可有补充?
  • 二维平面内的碰撞检测【一】
  • 删除表内多余的重复数据
  • 小程序01:wepy框架整合iview webapp UI
  • ​iOS实时查看App运行日志
  • #大学#套接字
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (备忘)Java Map 遍历
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (算法)Game
  • (图)IntelliTrace Tools 跟踪云端程序
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)人的集合论——移山之道
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Micro Framework初体验(二)
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • @EnableConfigurationProperties注解使用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [BZOJ1008][HNOI2008]越狱
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C/C++] C/C++中数字与字符串之间的转换
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  • [Java][算法 双指针]Day 02---LeetCode 热题 100---04~07
  • [javaSE] 看知乎学习工厂模式
  • [KMP求最小循环节][HDU1358][Period]