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 相关文章推荐
DOM 脚本编程中的兄弟节点
Oct 31 Javascript
eclipse如何忽略js文件报错(附图)
Oct 30 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
浅析javascript中的DOM
Mar 01 Javascript
jQuery on()方法示例及jquery on()方法的优点
Aug 27 Javascript
JS动态插入并立即执行回调函数的方法
Apr 21 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
vue router-link 默认a标签去除下划线的实现
Nov 06 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图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python模拟事件触发机制详解
2018/01/19 Python
浅析Python数据处理
2018/05/02 Python
python 除法保留两位小数点的方法
2018/07/16 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Django视图扩展类知识点详解
2019/10/25 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
自考生毕业自我鉴定
2013/10/10 职场文书
大学生毕业自我评价范文分享
2013/11/07 职场文书
广告语设计及教案
2014/03/21 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
2014年施工员工作总结
2014/11/18 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers