JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
本文實(shí)例講述了JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
觀察者模式,又稱為發(fā)布訂閱模式,它定義了一種一對(duì)多的關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象的狀態(tài)發(fā)生變化時(shí)就會(huì)通知所有的觀察者對(duì)象,使得它們能夠自動(dòng)更新自己的狀態(tài)。
在觀察者模式中,并不是一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象的方法,而是一個(gè)對(duì)象訂閱另一個(gè)對(duì)象的特定活動(dòng)并在狀態(tài)改變后獲得通知。訂閱者也稱為觀察者,而被觀察的對(duì)象稱為發(fā)布者或主題。當(dāng)發(fā)生了一個(gè)重要的事件時(shí),發(fā)布者將會(huì)通知(調(diào)用)所有訂閱者并且可能經(jīng)常以事件對(duì)象的形式傳遞消息。
思路:
① 發(fā)布者需要一個(gè)數(shù)組類型的屬性subscribers,以存儲(chǔ)所有的訂閱者;
② 訂閱subscribe():將新的訂閱者加入到這個(gè)數(shù)組中去;
③ 退訂unsubscribe():從訂閱者數(shù)組中刪除某個(gè)訂閱者;
④ 發(fā)布publish():循環(huán)遍歷subscribers數(shù)組中的每一個(gè)元素,并通知他們,即發(fā)送消息,意味著調(diào)用訂閱者的某個(gè)方法。因此,當(dāng)用戶訂閱信息時(shí),該訂閱者需要向subscribe()提供它的其中一個(gè)方法。
subscribe()、unsubscribe()、publish()三種方法都需要一個(gè)type參數(shù),因?yàn)榘l(fā)布者可能觸發(fā)多個(gè)事件,而用戶可能僅選擇訂閱其中一種,而不是另外一種。
使用觀察者模式的好處:
① 支持簡(jiǎn)單的廣播通信,自動(dòng)通知所有已經(jīng)訂閱過(guò)的對(duì)象。
② 頁(yè)面載入后目標(biāo)對(duì)象很容易與觀察者存在一種動(dòng)態(tài)關(guān)聯(lián),增加了靈活性。
③ 目標(biāo)對(duì)象與觀察者之間的抽象耦合關(guān)系能夠單獨(dú)擴(kuò)展以及重用。
在JavaScript中,一般使用事件模型來(lái)替代傳統(tǒng)的觀察者模式。 DOM事件,也是JavaScript和DOM之間實(shí)現(xiàn)的一種觀察者模式。
Eg1:
監(jiān)聽(tīng)用戶單擊按鈕的動(dòng)作,但沒(méi)有辦法預(yù)知用戶將在什么時(shí)候點(diǎn)擊。因此,訂閱按鈕上的click事件,當(dāng)按鈕被點(diǎn)擊時(shí),便向訂閱者發(fā)布此消息。
btn.addEventListener("click", function() {
console.log("First click");
}, false);
// 可以有多個(gè)訂閱者
btn.addEventListener("click", function() {
console.log("Second click");
}, false);
btn.click();
Eg2:
非觀察者模式:
$.ajax({
url: './login',
type: 'post',
contentType: 'application/json',
dataType:'json',
success: function(data) {
if(data.status === "success") { // 登錄成功,渲染header、footer
header.setInfo(data.headerInfo);
footer.setInfo(data.footerInfo);
}
}
});
觀察者模式:
$.ajax({
...,
success: function(data) {
if(data.status === "success") {
// 登錄成功,發(fā)布登陸成功消息
login.trigger("loginsuccess", data);
}
}
});
var header = (function() { // 監(jiān)聽(tīng)消息
login.listen("loginsuccess", function(data){
header.setInfo(data.headerInfo);
});
return {
setInfo: function(data) {
console.log("渲染header");
}
};
})();
var footer = (function() {
login.listen("loginsuccess", function(data){
footer.setInfo(data.navInfo);
});
return {
setInfo: function(data) {
console.log("渲染nav");
}
};
})();
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- JavaScript事件發(fā)布/訂閱模式原理與用法分析
- JavaScript實(shí)現(xiàn)與使用發(fā)布/訂閱模式詳解
- JavaScript中發(fā)布/訂閱模式的簡(jiǎn)單實(shí)例
- JS前端設(shè)計(jì)模式之發(fā)布訂閱模式詳解
- js 發(fā)布訂閱模式的實(shí)例講解
- JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
- 詳解JavaScript設(shè)計(jì)模式中的享元模式
- JavaScript設(shè)計(jì)模式之單例模式應(yīng)用場(chǎng)景案例詳解
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
- javascript 發(fā)布-訂閱模式 實(shí)例詳解
相關(guān)文章
js+css 實(shí)現(xiàn)遮罩居中彈出層(隨瀏覽器窗口滾動(dòng)條滾動(dòng))
本文為大家詳細(xì)介紹下使用js實(shí)現(xiàn)遮罩彈出層居中,且隨瀏覽器窗口滾動(dòng)條滾動(dòng),示例代碼如下,感興趣的朋友可以參考下2013-12-12
Promise.all中對(duì)于reject的處理方法
這篇文章主要介紹了Promise.all中對(duì)于reject的處理方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
bootstrap fileinput 插件使用項(xiàng)目總結(jié)(經(jīng)驗(yàn))
這篇文章主要介紹了bootstrap fileinput 插件使用項(xiàng)目總結(jié),是小編日常碰到的問(wèn)題及解決方法,需要的朋友可以參考下2017-02-02
JavaScript中對(duì)于SPA單頁(yè)面的理解
這篇文章主要介紹了JavaScript中對(duì)于SPA單頁(yè)面的理解,單頁(yè)應(yīng)用SPA是一種網(wǎng)絡(luò)應(yīng)用程序或網(wǎng)站的模型,它通過(guò)動(dòng)態(tài)重寫(xiě)當(dāng)前頁(yè)面來(lái)與用戶交互2023-02-02
用js控制組織結(jié)構(gòu)圖可以任意拖拽到指定位置
用js控制生成了一個(gè)組織結(jié)構(gòu)圖并設(shè)置這個(gè)組織結(jié)構(gòu)可以任意拖動(dòng)到指定位置,具體代碼如下2014-01-01
根據(jù)后端返回的json數(shù)據(jù)快速生成ts類型的實(shí)現(xiàn)代碼
在前端開(kāi)發(fā)中,我們通常需要處理來(lái)自后端或其他數(shù)據(jù)源的 JSON 數(shù)據(jù),這些數(shù)據(jù)可能非常復(fù)雜,包含不同類型的屬性,甚至嵌套對(duì)象和數(shù)組,為了更好地使用這些數(shù)據(jù),我們希望將其轉(zhuǎn)換為T(mén)ypeScript類型定義,以獲得類型檢查和代碼智能提示的好處2023-10-10

