摘要:實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點參考設(shè)計模式和開發(fā)實踐之責任鏈模式職責鏈模式
作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當?shù)膶崿F(xiàn)方式 :)0. 項目地址
責任鏈模式·代碼
《每天一個設(shè)計模式》地址
1. 什么是“責任鏈模式”?責任鏈模式:多個對象均有機會處理請求,從而解除發(fā)送者和接受者之間的耦合關(guān)系。這些對象連接成為鏈式結(jié)構(gòu),每個節(jié)點轉(zhuǎn)發(fā)請求,直到有對象處理請求為止。
其核心就是:請求者不必知道是誰哪個節(jié)點對象處理的請求。如果當前不符合終止條件,那么把請求轉(zhuǎn)發(fā)給下一個節(jié)點處理。
而當需求具有“傳遞”的性質(zhì)時(代碼中其中一種體現(xiàn)就是:多個if、else if、else if、else嵌套),就可以考慮將每個分支拆分成一個節(jié)點對象,拼接成為責任鏈。
2. 優(yōu)點與代價
優(yōu)點
可以根據(jù)需求變動,任意向責任鏈中添加 / 刪除節(jié)點對象
沒有固定的“開始節(jié)點”,可以從任意節(jié)點開始
代價:責任鏈最大的代價就是每個節(jié)點帶來的多余消耗。當責任鏈過長,很多節(jié)點只有傳遞的作用,而不是真正地處理邏輯。
3. 代碼實現(xiàn)為了方便演示,模擬常見的“日志打印”場景。模擬了 3 種級別的日志輸出:
LogHandler: 普通日志
WarnHandler:警告日志
ErrorHandler:錯誤日志
首先我們會構(gòu)造“責任鏈”:LogHandler -> WarnHandler -> ErrorHandler。LogHandler作為鏈的開始節(jié)點。
如果是普通日志,那么就由 LogHandler 處理,停止傳播;如果是 Warn 級別的日志,那么 LogHandler 就會自動向下傳遞,WarnHandler 接收到并且處理,停止傳播;Error 級別日志同理。
3.1 ES6 實現(xiàn)class Handler { constructor() { this.next = null; } setNext(handler) { this.next = handler; } } class LogHandler extends Handler { constructor(...props) { super(...props); this.name = "log"; } handle(level, msg) { if (level === this.name) { console.log(`LOG: ${msg}`); return; } this.next && this.next.handle(...arguments); } } class WarnHandler extends Handler { constructor(...props) { super(...props); this.name = "warn"; } handle(level, msg) { if (level === this.name) { console.log(`WARN: ${msg}`); return; } this.next && this.next.handle(...arguments); } } class ErrorHandler extends Handler { constructor(...props) { super(...props); this.name = "error"; } handle(level, msg) { if (level === this.name) { console.log(`ERROR: ${msg}`); return; } this.next && this.next.handle(...arguments); } } /******************以下是測試代碼******************/ let logHandler = new LogHandler(); let warnHandler = new WarnHandler(); let errorHandler = new ErrorHandler(); // 設(shè)置下一個處理的節(jié)點 logHandler.setNext(warnHandler); warnHandler.setNext(errorHandler); logHandler.handle("error", "Some error occur");3.2 Python3 實現(xiàn)
class Handler(): def __init__(self): self.next = None def set_next(self, handler): self.next = handler class LogHandler(Handler): def __init__(self): super().__init__() self.__name = "log" def handle(self, level, msg): if level == self.__name: print("LOG: ", msg) return if self.next != None: self.next.handle(level, msg) class WarnHandler(Handler): def __init__(self): super().__init__() self.__name = "warn" def handle(self, level, msg): if level == self.__name: print("WARN: ", msg) return if self.next != None: self.next.handle(level, msg) class ErrorHandler(Handler): def __init__(self): super().__init__() self.__name = "error" def handle(self, level, msg): if level == self.__name: print("ERROR: ", msg) return if self.next != None: self.next.handle(level, msg) # 以下是測試代碼 log_handler = LogHandler() warn_handler = WarnHandler() error_handler = ErrorHandler() # 設(shè)置下一個處理的節(jié)點 log_handler.set_next(warn_handler) warn_handler.set_next(error_handler) log_handler.handle("error", "Some error occur")4. 參考
《JavaScript 設(shè)計模式和開發(fā)實踐》
javascript 之 責任鏈模式
職責鏈模式
5.文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/100774.html
摘要:實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點參考設(shè)計模式和開發(fā)實踐之責任鏈模式職責鏈模式 作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當?shù)膶崿F(xiàn)方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設(shè)計模式》地址 1. 什么是...
摘要:實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點參考設(shè)計模式和開發(fā)實踐之責任鏈模式職責鏈模式 作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當?shù)膶崿F(xiàn)方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設(shè)計模式》地址 1. 什么是...
摘要:實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點實現(xiàn)以下是測試代碼設(shè)置下一個處理的節(jié)點參考設(shè)計模式和開發(fā)實踐之責任鏈模式職責鏈模式 作者按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript和python兩種語言實現(xiàn)。誠然,每種設(shè)計模式都有多種實現(xiàn)方式,但此小冊只記錄最直截了當?shù)膶崿F(xiàn)方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設(shè)計模式》地址 1. 什么是...
摘要:責任鏈模式涉及到的角色如下所示抽象處理者角色定義一個處理請求的抽象類。如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。一般來說,日常開發(fā)中不純的責任鏈模式用的比較多一點。參考責任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的: 責任鏈模式是一種對象的行為模式。在責任鏈模式里,...
時間:2017年08月30日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現(xiàn)責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應(yīng)用 案例:...
閱讀 1385·2021-09-27 13:56
閱讀 2414·2019-08-26 10:35
閱讀 3570·2019-08-23 15:53
閱讀 1927·2019-08-23 14:42
閱讀 1291·2019-08-23 14:33
閱讀 3636·2019-08-23 12:36
閱讀 2042·2019-08-22 18:46
閱讀 1068·2019-08-22 14:06