//模拟一个目标可能拥有的一些列依赖
function ObserverList() {
this.observerList = [];
}; //添加一个观察者
ObserverList.prototype.Add = function (obj) {
return this.observerList.push(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();
}
}; //扩展对象
function extend(obj, extension) {
console.log(obj);
for (var k in obj) {
console.log(k);
extension[k] = obj[k]
}
}; //模拟一个目标对象,并模拟实现在观察者列表上添加、删除和通知观察者的能力
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.RemoveAllObserver = function () {
this.observers = [];
} //模拟实现通知功能
Subject.prototype.Notify = function (context) {
var observerCount = this.observers.Count();
for (var i = 0; i < observerCount; i++) {
this.observers.Get(i).Update(context);
}
};
//模拟创建一个观察者
function Observer() {
this.Update = function () {
};
} var controlCheckbox = document.getElementById("mainCheckBox");
var removerObserver = document.getElementById("removerAllObserver");
var addBtn = document.getElementById("addNewObserver");
var container = document.getElementById("observerContainer");
extend(new Subject(), controlCheckbox); controlCheckbox["onclick"] = Function("controlCheckbox.Notify(controlCheckbox.checked)"); addBtn["onclick"] = AddNewObserver;
function AddNewObserver() {
var check = document.createElement("input");
check.type = "checkbox";
extend(new Observer(), check);
check.Update = function (value) {
this.checked = value;
};
controlCheckbox.AddObserver(check);
container.appendChild(check);
}

最新文章

  1. eclipse发布web项目到生产环境的方式汇总(tomcat)
  2. cocos2dx中常见设计模式
  3. python socket server源码学习
  4. doc2vec使用说明(一)gensim工具包TaggedLineDocument
  5. SQLite页缓冲区管理
  6. asp.net GridView控件中诗选全选和全不选功能
  7. OracleCommand.CommandText 无效
  8. MySQL 建表
  9. hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性
  10. php动态编译mysqli扩展
  11. P4114 Qtree1
  12. 人力资源项目中 add_account.php
  13. 洛谷 P1706 全排列问题
  14. POJ1569 Myacm Triangles
  15. 控件_DatePicker
  16. day12 max min zip 用法
  17. JAVA编程思想学习笔记7-chap19-21-斗之气7段
  18. 【gulp-sass】本地搭建sass开发环境
  19. root用户登录mysql后新建用户提示1045错误
  20. 常用Java集合类总结

热门文章

  1. Java中编写线程安全代码的原理(Java concurrent in practice的快速要点)
  2. 理解linux服务器mcelog如何工作
  3. SuperSocket使用自定义协议与服务端通信发送实例
  4. jqGrid 跨页选择以及回显的处理
  5. 飘逸的python - 单例模式乱弹
  6. oracle分页计算公式
  7. Java快速向数据库中插入大量数据 比如10万条以上
  8. 洛谷P2826 LJJ的数学课
  9. springboot 简单自定义starter - dubbo
  10. 默认约束 default