Javascript设计模式之观察者模式(推荐)


Posted in Javascript onMarch 29, 2016

推荐阅读: JavaScript观察者模式(经典)

1.什么是观察者模式

观察者模式有时也称为发布--订阅模式,在观察者模式中,有一个观察者可以管理所有的目标,等到有状态发生改变的时候发出通知。(其实sql server中的发布订阅也是这个道理)

2.通俗解释

假如以前村里的广播是一个观察者,那么每个村民就是被观察对象,如果村子里有通知,政策发生改变的时候,就需要通过广播把这个消息发布出去,而不用直接一家家的跑去发通知。

3.代码

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<title>观察者模式</title> 
</head> 
<body> 
<script> 
var observer = {//观察者 
villagers: [],//村名 
addVillager: function (callback) {//增加村名 
this.villagers[this.villagers.length] = callback; 
}, 
removeVillager: function (callback) {//移除村名 
for (var i = 0; i < this.villagers.length; i++) { 
if (this.villagers[i] === callback) { 
delete this.villagers[i]; 
} 
} 
}, 
publish: function (info) {//发布信息 
for (var i = 0; i < this.villagers.length; i++) { 
if (typeof this.villagers[i] === 'function') { 
this.villagers[i](info); 
} 
} 
}, 
make: function (o) {//这里将村子建一个这种广播方式 
for (var i in this) { 
o[i] = this[i]; 
} 
} 
}; 
var village1 = {}; 
observer.make(village1);//将村子1建立这种观察者模式 
var villager11 = { 
read: function (what) { 
console.log('我是第一个村子的第一个村名:' + what); 
} 
}; 
var villager12 = { 
read: function (what) { 
console.log('我是第一个村子的第二个村名:'+what); 
} 
}; 
village1.addVillager(villager11.read); 
village1.addVillager(villager12.read); 
village1.publish('大家来开会呀!!!'); 
village1.removeVillager(villager11.read); 
village1.publish('大家来开会呀!!!'); 
/* var village2 = { 
myAddVillager:function(callback){ 
this.addVillager(callback); 
}, 
myRemoveVillager:function(callback){ 
this.removeVillager(callback); 
}, 
myPublish:function(info){ 
this.publish(info); 
} 
}; 
observer.make(village2);//将村子1建立这种观察者模式 
var villager21 = { 
read: function (what) { 
console.log('我是第二个村子的第一个村名:' + what); 
} 
}; 
var villager22 = { 
read: function (what) { 
console.log('我是第二个村子的第二个村名:'+what); 
} 
}; 
village2.myAddVillager(villager21.read); 
village2.myAddVillager(villager22.read); 
village2.myPublish('大家来领猪肉了!!!');*/ 
</script> 
</body> 
</html>

写到这里观察者模式实现了,但是可能会有多个村子需要这种模式,那我们这里将observer改造成构造函数的方式

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<title>观察者模式</title> 
</head> 
<body> 
<script> 
function Observer(){//观察者,这里采用构造函数,可以对不同村落进行使用 
if(!(this instanceof Observer)){ 
return new Observer(); 
} 
this.villagers = []; 
}; 
Observer.prototype = { 
// villagers: [],//村名 
addVillager: function (callback) {//增加村名 
this.villagers[this.villagers.length] = callback; 
}, 
removeVillager: function (callback) {//移除村名 
for (var i = 0; i < this.villagers.length; i++) { 
if (this.villagers[i] === callback) { 
delete this.villagers[i]; 
} 
} 
}, 
publish: function (info) {//发布信息 
for (var i = 0; i < this.villagers.length; i++) { 
if (typeof this.villagers[i] === 'function') { 
this.villagers[i](info); 
} 
} 
}, 
make: function (o) {//这里将村子建一个这种广播方式 
for (var i in this) { 
o[i] = this[i]; 
} 
} 
} 
var village1 = {}; 
var observer1 = new Observer(); 
observer1.make(village1);//将村子1建立这种观察者模式 
var villager11 = { 
read: function (what) { 
console.log('我是第一个村子的第一个村名:' + what); 
} 
}; 
var villager12 = { 
read: function (what) { 
console.log('我是第一个村子的第二个村名:'+what); 
} 
}; 
village1.addVillager(villager11.read); 
village1.addVillager(villager12.read); 
village1.publish('大家来开会呀!!!'); 
village1.removeVillager(villager11.read); 
village1.publish('大家来开会呀!!!'); 
var village2 = { 
myAddVillager:function(callback){ 
this.addVillager(callback); 
}, 
myRemoveVillager:function(callback){ 
this.removeVillager(callback); 
}, 
myPublish:function(info){ 
this.publish(info); 
} 
}; 
var observer2 = new Observer(); 
observer2.make(village2);//将村子1建立这种观察者模式 
var villager21 = { 
read: function (what) { 
console.log('我是第二个村子的第一个村名:' + what); 
} 
}; 
var villager22 = { 
read: function (what) { 
console.log('我是第二个村子的第二个村名:'+what); 
} 
}; 
village2.myAddVillager(villager21.read); 
village2.myAddVillager(villager22.read); 
village2.myPublish('大家来领猪肉了!!!'); 
</script> 
</body> 
</html>

有关Javascript设计模式之观察者模式小编就给大家介绍到这里,希望对大家有所帮助!

Javascript 相关文章推荐
JS 统计时间
Mar 09 Javascript
用JavaScript隐藏控件的方法
Sep 21 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
javascript中全局对象的parseInt()方法使用介绍
Dec 19 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
Vue关于数据绑定出错解决办法
May 15 Javascript
关于vue.js发布后路径引用的问题解决
Aug 15 Javascript
element-ui 表格数据时间格式化的方法
Aug 24 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 Javascript
AngularJS directive返回对象属性详解
Mar 28 #Javascript
Boostrap模态窗口的学习小结
Mar 28 #Javascript
理解javascript模块化
Mar 28 #Javascript
谈一谈jQuery核心架构设计
Mar 28 #Javascript
javascript函数自动执行常用方法汇总
Mar 28 #Javascript
JavaScript利用HTML DOM进行文档操作的方法
Mar 28 #Javascript
JavaScript常用本地对象小结
Mar 28 #Javascript
You might like
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
python 算法 排序实现快速排序
2012/06/05 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
keras中的backend.clip用法
2020/05/22 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
项目合作协议书范本
2014/04/16 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
幼儿园见习报告
2014/10/30 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python