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 相关文章推荐
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
javascript生成随机大小写字母的方法
Feb 20 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
Mar 19 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
May 23 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
Sep 03 Javascript
JS原型对象操作实例分析
Jun 06 Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 Javascript
ant design vue的form表单取值方法
Jun 01 Vue.js
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来检测proxy
2006/10/09 PHP
php定界符
2014/06/19 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
求职简历的自我评价
2014/01/31 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
贷款委托书范本
2014/04/08 职场文书
市政管理求职信范文
2014/05/07 职场文书
质量承诺书格式
2014/05/20 职场文书
文明班集体申报材料
2014/05/23 职场文书
信用卡工资证明范本
2014/10/17 职场文书
干部考察材料范文
2014/12/24 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书