JavaScript職責鏈模式概述
一、概述
職責鏈模式(Chain of responsibility),就是使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理他為止。
貌似和數(shù)據(jù)結(jié)構(gòu)中的鏈表一樣。
但,不要搞混了,職責鏈可不等于鏈表哦,因為職責鏈可以在任何一個節(jié)點開始往下查找,而鏈表,則必須從頭結(jié)點開始往下查找。
比如,DOM事件機制中的冒泡事件就屬于職責鏈,而捕獲事件則屬于鏈表。
二、利用職責鏈模擬冒泡
假設我們有三個對象:li、ul、div,三者關(guān)系圖如下:
比如,當我們觸發(fā)li對象時,如果li沒有阻止冒泡,那么將會傳遞給ul對象,到了ul,如果沒有阻止冒泡,則會傳遞給div對象(假設這里div為根節(jié)點)。同理,ul、div。
看到這兒,很清楚適合用職責鏈模式,編寫這樣的需求。
但,怎么使用JavaScript實現(xiàn)職責鏈模式呢?
如下,我們可以通過原型鏈的方式構(gòu)建基本架構(gòu):
function CreateDOM(obj){ this.next = obj || null; }; CreateDOM.prototype = { handle: function(){ if(this.next){ this.next.handle(); } } };
每當我們利用CreateDOM構(gòu)造函數(shù),創(chuàng)建一個對象時,就將與之關(guān)聯(lián)的對象傳遞進去(嗯,這樣很鏈表)。
然后,當我們觸發(fā)某個對象,執(zhí)行handle方法時,就可以沿著這條鏈,走下去了。
但,需注意,當某個對象的handle屬性覆蓋了原型鏈中的handle時,怎么繼續(xù)往下傳呢?
利用CreateDOM.prototype.handle.call(this);就好了。
So,實現(xiàn)li、ul和div代碼如下:
var li = null, ul = null, div = null; div = new CreateDOM(); div.handle = function(stopBubble){ console.log('DIV'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } }; ul = new CreateDOM(div); ul.handle = function(stopBubble){ console.log('UL'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } }; li = new CreateDOM(ul); li.handle = function(stopBubble){ console.log('LI'); if(stopBubble){ return; }else{ CreateDOM.prototype.handle.call(this); } };
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- javascript設計模式 – 職責鏈模式原理與用法實例分析
- JavaScript設計模式之職責鏈模式應用示例
- 深入理解JavaScript系列(38):設計模式之職責鏈模式詳解
- JavaScript實現(xiàn)職責鏈模式概述
- JavaScript設計模式--簡單工廠模式定義與應用案例詳解
- JavaScript設計模式---單例模式詳解【四種基本形式】
- JavaScript設計模式之觀察者模式與發(fā)布訂閱模式詳解
- JS 設計模式之:單例模式定義與實現(xiàn)方法淺析
- javascript設計模式 – 訪問者模式原理與用法實例分析
- javascript設計模式 – 模板方法模式原理與用法實例分析
- javascript設計模式 – 觀察者模式原理與用法實例分析
- JavaScript設計模式之職責鏈模式
相關(guān)文章
JavaScript中定時器setTimeout()和setInterval()的用法
本文詳細講解了JavaScript中定時器setTimeout()和setInterval()的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06一個字符串中出現(xiàn)次數(shù)最多的字符 統(tǒng)計這個次數(shù)【實現(xiàn)代碼】
下面小編就為大家?guī)硪黄粋€字符串中出現(xiàn)次數(shù)最多的字符 統(tǒng)計這個次數(shù)【實現(xiàn)代碼】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考2016-04-04xml分頁+ajax請求數(shù)據(jù)源+dom取結(jié)果實例代碼
最近做的一個項目里的某個小功能,主要是為了方便選擇數(shù)據(jù) 演示地址:由于有惡意程序,所以去掉地址2008-10-10createElement與createDocumentFragment的點點區(qū)別小結(jié)
在DOM操作里,createElement是創(chuàng)建一個新的節(jié)點,createDocumentFragment是創(chuàng)建一個文檔片段2011-12-12Bootstrap FileInput實現(xiàn)圖片上傳功能
這篇文章主要為大家詳細介紹了Bootstrap FileInput實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-01-01關(guān)于javascript sort()排序你可能忽略的一點理解
最近在研究Javascript發(fā)現(xiàn)了其中一些之前忽略的問題,所以想著總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于javascript sort()排序你可能忽略的一點理解,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07JavaScript和jquery獲取父級元素、子級元素、兄弟元素的方法
本文給大家簡單總結(jié)了下JavaScript和jquery獲取父級元素、子級元素、兄弟元素的方法,非常的簡單實用,有需要的小伙伴可以參考下2016-06-06