手把手教你用Javascript實(shí)現(xiàn)觀察者模式
更新時(shí)間:2021年12月02日 16:44:11 作者:1900's 88 keys
這篇文章主要為大家介紹了Javascript觀察者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
什么是觀察者模式?
- 觀察者模式一種設(shè)計(jì)模式。
- 觀察者模式定義了對(duì)象間的一種 一對(duì)多 的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知,并自動(dòng)更新。
- 簡(jiǎn)單說(shuō)明,在觀察者模式中,有兩個(gè)模型,一個(gè)觀察者(observer)和一個(gè)被觀察者(Observed)。當(dāng)被觀察者發(fā)生改變或變化時(shí),會(huì)通知觀察者。
場(chǎng)景模擬
- 倘若即將到來(lái)雙11,想要在雙11購(gòu)買(mǎi)商品的人就是觀察者(Observer)
- 想要購(gòu)買(mǎi)的商品就是被觀察者(Observed)
- 為了更加形象,添加一個(gè)商家來(lái)改變商品的價(jià)格,商家也就是發(fā)布者(Publish)
- 當(dāng)雙11當(dāng)天,商家(發(fā)布者(Publish))會(huì)修改商品(被觀察者(Observed))的價(jià)格,然后關(guān)注訂閱該商品的人(觀察者(Observer))就會(huì)收到信息通知。

代碼實(shí)現(xiàn)
//觀察者設(shè)計(jì)模式
//發(fā)布者 -->商家
var shopObj = {};
//商品列表 [key:[]], key為商品名
shopObj.list = [];
//訂閱方法
shopObj.listen = function ( key, fn) {// key是商品型號(hào), fn這個(gè)函數(shù)就是訂閱的行為
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);//往商品名為key的商品列表中添加訂閱
}
//發(fā)布消息方法
shopObj.publish = function (key) {
//var key = arguments[0];//如果不傳參數(shù)key,這樣也可以
var fns = this.list[key];
// for (var i = 0; i < fns.length; i++) {
for(var i = 0 ,fn; fn = fns[i++];){
//執(zhí)行訂閱的函數(shù)fn arguemnts儲(chǔ)存的所有實(shí)參
// var fn = fns[i++];
fn.apply(this, arguments)
}
}
//A用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
console.log( "A用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//B用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
console.log("B用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//c用戶添加訂閱
shopObj.listen("小米", function (brand, model) {
console.log("C用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//雙11 商家發(fā)布消息華為降價(jià)的信息
shopObj.publish("華為", "p30");
shopObj.publish("小米", "Mix4");

重構(gòu)代碼
//觀察者設(shè)計(jì)模式
var Eevent = {
//商品列表 [key:[]], key為商品名
list: [],
//訂閱方法
listen: function (key, fn) {// key是商品型號(hào), fn這個(gè)函數(shù)就是訂閱的行為
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);
},
//發(fā)布消息方法
publish: function (key) {
//var key = arguments[0];//如果不傳參數(shù)key,這樣也可以
var fns = this.list[key];
// for (var i = 0; i < fns.length; i++) {
for (var i = 0, fn; fn = fns[i++];) {
//執(zhí)行訂閱的函數(shù)fn arguemnts儲(chǔ)存的所有實(shí)參
// var fn = fns[i++];
fn.apply(this, arguments)
}
}
}
//觀察者對(duì)象初始化
var initEvent = function (obj) {
for (var i in Eevent) {
obj[i] = Eevent[i];
}
}
//發(fā)布者 -->商家
var shopObj = {};
initEvent(shopObj);
//A用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
console.log("A用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//B用戶添加訂閱
shopObj.listen("華為", function (brand, model) {
console.log("B用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//c用戶添加訂閱
shopObj.listen("小米", function (brand, model) {
console.log("C用戶收到:" + brand + model + "手機(jī)降價(jià)了");
})
//雙11 商家發(fā)布消息華為降價(jià)的信息
shopObj.publish("華為", "p30");
shopObj.publish("小米", "Mix4");

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
您可能感興趣的文章:
- 使用JavaScript輕松實(shí)現(xiàn)拖拽功能
- vue elementUi+sortable.js實(shí)現(xiàn)嵌套表格拖拽問(wèn)題
- 淺析原生JavaScript中拖拽屬性draggable的使用
- JavaScript實(shí)現(xiàn)文件的拖拽上傳功能
- vue結(jié)合el-table實(shí)現(xiàn)表格行拖拽排序(基于sortablejs)
- element-plus結(jié)合sortablejs實(shí)現(xiàn)table行拖拽效果
- js觀察者模式的介紹及使用
- js觀察者模式的彈幕案例
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- JavaScript 拖拽與觀察者模式的實(shí)現(xiàn)及應(yīng)用小結(jié)
相關(guān)文章
web前端開(kāi)發(fā)upload上傳頭像js示例代碼
這篇文章主要為大家詳細(xì)介紹了web前端開(kāi)發(fā)upload上傳頭像js示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
前端排查內(nèi)存泄漏的方法及實(shí)戰(zhàn)案例
內(nèi)存泄漏是指在程序運(yùn)行時(shí),分配的內(nèi)存沒(méi)有被正確釋放,導(dǎo)致內(nèi)存空間的浪費(fèi),最終可能會(huì)導(dǎo)致程序崩潰或運(yùn)行緩慢,這篇文章主要介紹了前端排查內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下2025-03-03
一篇文章教你用JavaScript使用流程控制打印九九乘法表
這篇文章主要為大家詳細(xì)介紹了JavaScript使用流程控制打印九九乘法表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
D3.js實(shí)現(xiàn)餅圖,環(huán)圖,玫瑰圖的繪制
這篇文章主要為大家介紹了如何利用D3.js中的d3.pie和d3.arc實(shí)現(xiàn)餅圖、環(huán)圖和玫瑰圖的繪制,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的可以嘗試一下2022-11-11
JavaScript常用驗(yàn)證函數(shù)實(shí)例匯總
這篇文章主要介紹了JavaScript常用驗(yàn)證函數(shù),實(shí)例匯總了如字符串驗(yàn)證、表單驗(yàn)證及js常用特效等諸多js常用驗(yàn)證函數(shù)及相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11

