手把手教你用Javascript實(shí)現(xiàn)觀察者模式
更新時(shí)間:2021年12月02日 16:44:11 作者:1900's 88 keys
這篇文章主要為大家介紹了Javascript觀察者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
什么是觀察者模式?
- 觀察者模式一種設(shè)計(jì)模式。
- 觀察者模式定義了對(duì)象間的一種 一對(duì)多 的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知,并自動(dòng)更新。
- 簡單說明,在觀察者模式中,有兩個(gè)模型,一個(gè)觀察者(observer)和一個(gè)被觀察者(Observed)。當(dāng)被觀察者發(fā)生改變或變化時(shí),會(huì)通知觀察者。
場景模擬
- 倘若即將到來雙11,想要在雙11購買商品的人就是觀察者(Observer)
- 想要購買的商品就是被觀察者(Observed)
- 為了更加形象,添加一個(gè)商家來改變商品的價(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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
您可能感興趣的文章:
- 使用JavaScript輕松實(shí)現(xiàn)拖拽功能
- vue elementUi+sortable.js實(shí)現(xià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)文章
動(dòng)態(tài)的9*9乘法表效果的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄獎(jiǎng)討B(tài)的9*9乘法表效果的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2016-05-05利用uniapp開發(fā)APP時(shí)的調(diào)試/安卓打包等詳解
uni-app??是一個(gè)使用??Vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,下面這篇文章主要給大家介紹了關(guān)于利用uniapp開發(fā)APP時(shí)的調(diào)試/安卓打包等的相關(guān)資料,需要的朋友可以參考下2022-12-12JavaScript實(shí)現(xiàn)基礎(chǔ)排序算法的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)基礎(chǔ)排序算法,如:冒泡排序、選擇排序、插入排序和快速排序,感興趣的可以了解一下2022-06-06Javascript 定時(shí)器調(diào)用傳遞參數(shù)的方法
Javascript 定時(shí)器調(diào)用傳遞參數(shù)的方法,需要的朋友可以參考下。2009-11-11