js觀察者模式的介紹及使用
一、定義
觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象(通知者)。這個(gè)主題對(duì)象觀察到被觀察者發(fā)生變化時(shí),會(huì)通知所有的觀察者對(duì)象,使它們能夠自己更新自己
這里涉及了幾個(gè)角色及他們自己功能:
- 觀察者對(duì)象:可以更新自己
- 主題對(duì)象:可以添加觀察者,移除觀察者,通知觀察者
- 被觀察者:被主題對(duì)象監(jiān)視,當(dāng)被觀察者發(fā)生變化時(shí),主題對(duì)象會(huì)通知觀察者更新自己的狀態(tài)
二、使用場(chǎng)景
當(dāng)一個(gè)對(duì)象改變需要同時(shí)改變其他對(duì)象的時(shí)候,而且不需要知道有多少個(gè)對(duì)象需要改變
三、舉個(gè)例子
如果干巴巴的概念描述晦澀難懂,舉個(gè)生活中常見(jiàn)的例子說(shuō)明一下
場(chǎng)景1:
寫(xiě)字樓中,電腦跟前。一堆程序員趁老板出差的機(jī)會(huì)在電腦上NBA球賽,時(shí)不時(shí)激動(dòng)的大喊大叫。此時(shí),老板出差回來(lái),剛好碰個(gè)正著,場(chǎng)面一度尷尬。
解決方案:
為了避免在公司劃水摸魚(yú)時(shí),被進(jìn)門(mén)的老板抓到,幾個(gè)人想了個(gè)方案,賄賂前臺(tái)小姐姐。當(dāng)老板以后再進(jìn)公司門(mén)的時(shí)候,小姐姐立馬通知程序員們,讓他們恢復(fù)到工作的狀態(tài)
場(chǎng)景2:
寫(xiě)字樓中,電腦跟前。一堆程序員趁老板出差的機(jī)會(huì)在電腦上NBA球賽,時(shí)不時(shí)激動(dòng)的大喊大叫。此時(shí),老板出差回來(lái)。前臺(tái)小姐姐看到老板回來(lái),立馬給看球賽的小哥哥們發(fā)通知。此時(shí)小哥哥們趕緊切換成工作的狀態(tài)。
場(chǎng)景2就是使用了觀察者模式。當(dāng)老板回來(lái)時(shí),程序員們需要改變劃水的狀態(tài),由前臺(tái)小姐姐負(fù)責(zé)通知他們
| 人物 | 角色 | 功能 |
|---|---|---|
| 程序員 | 觀察者 | 可以改變自己的狀態(tài) |
| 前臺(tái)小姐姐 | 主題(通知者) | 收集、移除及保存需要通知的程序員(觀察者),給程序員發(fā)送通知 |
| 老板 | 被觀察者 | 被前臺(tái)小姐姐觀察 |
通過(guò)案例應(yīng)該分清觀察者模式中的各個(gè)對(duì)象及各個(gè)對(duì)象的功能了。接下來(lái)進(jìn)行coding
四、Coding
1、前臺(tái)小姐姐類(通知者類)
/*
* desc:通知者類
* 1、存儲(chǔ)觀察者
* 2、添加觀察者
* 3、移除觀察者
* 4、通知觀察者
*/
class Dep {
constructor() {
//存儲(chǔ)觀察者
this.subs = []
}
/**
* 添加觀察者
* @param {觀察者對(duì)象} sub
*/
addSubs(sub) {
//確保觀察者都有update方法
if (sub && sub.update) {
this.subs.push(sub)
}
}
/**
* 移除觀察者
* @param {需要移除的觀察者對(duì)象} sub
*/
removeSub(sub) {
this.subs.forEach((item, index) => {
if (sub.id === item.id) {
this.subs.splice(index, 1)
return;
}
})
}
/**
* 通知觀察者,調(diào)用所有觀察者內(nèi)部的update的方法,改變自身狀態(tài)
* */
notify() {
this.subs.forEach(sub => {
sub.update()
})
}
}
2、程序員類(觀察者類)
/**
* 觀察者對(duì)象
*/
class watcher {
constructor(name) {
this.name = name
}
//觀察者對(duì)象都有自己的update方法,來(lái)改變自己的工作狀態(tài)
update() {
console.log(`${this.name}收到通知,改變工作狀態(tài)。`)
}
}
/**
* 觀察者對(duì)象
*/
class watcher {
constructor(name) {
this.name = name
}
//觀察者對(duì)象都有自己的update方法,來(lái)改變自己的工作狀態(tài)
update() {
console.log(`${this.name}收到通知,改變工作狀態(tài)。`)
}
}
3、模擬老板回公司,前臺(tái)小姐姐通知程序員
<script src="./js/Dep.js"></script>
<script src="./js/Watcher.js"></script>
<script>
//同事張三
const tongshi1 = new watcher("張三")
//同事李四
const tongshi2 = new watcher("李四")
//前臺(tái)小姐姐要知道哪些同事需要通知,把需要通知的同事收集起來(lái)
const xiaojiejie = new Dep();
xiaojiejie.addSubs(tongshi1)
xiaojiejie.addSubs(tongshi2)
//等待老板歸來(lái)....
//等等等....
//等等等....
//等等等....
//等等等....
//老板回來(lái)了
//當(dāng)老板回來(lái)時(shí),前臺(tái)小姐姐調(diào)用自己的notify方法通知程序員們 改變自身狀態(tài)
xiaojiejie.notify()
</script>
到此這篇關(guān)于java設(shè)計(jì)模式之觀察者模式的介紹及使用背景的文章就介紹到這了,更多相關(guān)觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用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行拖拽效果
- 手把手教你用Javascript實(shí)現(xiàn)觀察者模式
- js觀察者模式的彈幕案例
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- javascript設(shè)計(jì)模式 – 觀察者模式原理與用法實(shí)例分析
- JavaScript 拖拽與觀察者模式的實(shí)現(xiàn)及應(yīng)用小結(jié)
相關(guān)文章
JavaScript實(shí)現(xiàn)時(shí)鐘特效
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)時(shí)鐘特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
js+ajax實(shí)現(xiàn)的A*游戲路徑算法整理
js+ajax實(shí)現(xiàn)的A*游戲路徑算法整理...2007-05-05
JavaScript 報(bào)表展示實(shí)現(xiàn)代碼
以下是從網(wǎng)上找到的一段JavaScript實(shí)現(xiàn)圖形報(bào)表的代碼,對(duì)于想客戶端顯示報(bào)表的朋友可以參考下。2009-12-12
關(guān)于base64編碼和解碼的js工具函數(shù)
這篇文章主要介紹了關(guān)于base64編碼和解碼的js工具函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
LayUi使用switch開(kāi)關(guān),動(dòng)態(tài)的去控制它是否被啟用的方法
今天小編就為大家分享一篇LayUi使用switch開(kāi)關(guān),動(dòng)態(tài)的去控制它是否被啟用的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
javascript import css實(shí)例代碼
差點(diǎn)被FF下的insertRule給帶暈了. sheet.insertRule("@import url('aa.css');",sheet.cssRules.length);2008-07-07
layui多iframe頁(yè)面控制定時(shí)器運(yùn)行的方法
今天小編就為大家分享一篇layui多iframe頁(yè)面控制定時(shí)器運(yùn)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例
這篇文章主要介紹了json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

