摘要:實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)參考設(shè)計(jì)模式和開發(fā)實(shí)踐之責(zé)任鏈模式職責(zé)鏈模式
作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :)0. 項(xiàng)目地址
責(zé)任鏈模式·代碼
《每天一個(gè)設(shè)計(jì)模式》地址
1. 什么是“責(zé)任鏈模式”?責(zé)任鏈模式:多個(gè)對(duì)象均有機(jī)會(huì)處理請(qǐng)求,從而解除發(fā)送者和接受者之間的耦合關(guān)系。這些對(duì)象連接成為鏈?zhǔn)浇Y(jié)構(gòu),每個(gè)節(jié)點(diǎn)轉(zhuǎn)發(fā)請(qǐng)求,直到有對(duì)象處理請(qǐng)求為止。
其核心就是:請(qǐng)求者不必知道是誰哪個(gè)節(jié)點(diǎn)對(duì)象處理的請(qǐng)求。如果當(dāng)前不符合終止條件,那么把請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn)處理。
而當(dāng)需求具有“傳遞”的性質(zhì)時(shí)(代碼中其中一種體現(xiàn)就是:多個(gè)if、else if、else if、else嵌套),就可以考慮將每個(gè)分支拆分成一個(gè)節(jié)點(diǎn)對(duì)象,拼接成為責(zé)任鏈。
2. 優(yōu)點(diǎn)與代價(jià)
優(yōu)點(diǎn)
可以根據(jù)需求變動(dòng),任意向責(zé)任鏈中添加 / 刪除節(jié)點(diǎn)對(duì)象
沒有固定的“開始節(jié)點(diǎn)”,可以從任意節(jié)點(diǎn)開始
代價(jià):責(zé)任鏈最大的代價(jià)就是每個(gè)節(jié)點(diǎn)帶來的多余消耗。當(dāng)責(zé)任鏈過長,很多節(jié)點(diǎn)只有傳遞的作用,而不是真正地處理邏輯。
3. 代碼實(shí)現(xiàn)為了方便演示,模擬常見的“日志打印”場(chǎng)景。模擬了 3 種級(jí)別的日志輸出:
LogHandler: 普通日志
WarnHandler:警告日志
ErrorHandler:錯(cuò)誤日志
首先我們會(huì)構(gòu)造“責(zé)任鏈”:LogHandler -> WarnHandler -> ErrorHandler。LogHandler作為鏈的開始節(jié)點(diǎn)。
如果是普通日志,那么就由 LogHandler 處理,停止傳播;如果是 Warn 級(jí)別的日志,那么 LogHandler 就會(huì)自動(dòng)向下傳遞,WarnHandler 接收到并且處理,停止傳播;Error 級(jí)別日志同理。
3.1 ES6 實(shí)現(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); } } /******************以下是測(cè)試代碼******************/ let logHandler = new LogHandler(); let warnHandler = new WarnHandler(); let errorHandler = new ErrorHandler(); // 設(shè)置下一個(gè)處理的節(jié)點(diǎn) logHandler.setNext(warnHandler); warnHandler.setNext(errorHandler); logHandler.handle("error", "Some error occur");3.2 Python3 實(shí)現(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) # 以下是測(cè)試代碼 log_handler = LogHandler() warn_handler = WarnHandler() error_handler = ErrorHandler() # 設(shè)置下一個(gè)處理的節(jié)點(diǎn) log_handler.set_next(warn_handler) warn_handler.set_next(error_handler) log_handler.handle("error", "Some error occur")4. 參考
《JavaScript 設(shè)計(jì)模式和開發(fā)實(shí)踐》
javascript 之 責(zé)任鏈模式
職責(zé)鏈模式
5.文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42936.html
摘要:實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)參考設(shè)計(jì)模式和開發(fā)實(shí)踐之責(zé)任鏈模式職責(zé)鏈模式 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :) 0. 項(xiàng)目地址 責(zé)任鏈模式·代碼 《每天一個(gè)設(shè)計(jì)模式》地址 1. 什么是...
摘要:實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)參考設(shè)計(jì)模式和開發(fā)實(shí)踐之責(zé)任鏈模式職責(zé)鏈模式 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :) 0. 項(xiàng)目地址 責(zé)任鏈模式·代碼 《每天一個(gè)設(shè)計(jì)模式》地址 1. 什么是...
摘要:實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)參考設(shè)計(jì)模式和開發(fā)實(shí)踐之責(zé)任鏈模式職責(zé)鏈模式 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式 :) 0. 項(xiàng)目地址 責(zé)任鏈模式·代碼 《每天一個(gè)設(shè)計(jì)模式》地址 1. 什么是...
摘要:責(zé)任鏈模式涉及到的角色如下所示抽象處理者角色定義一個(gè)處理請(qǐng)求的抽象類。如果一個(gè)類承擔(dān)了一部分責(zé)任,還將請(qǐng)求踢給下一個(gè)皮球,則被稱為不純的責(zé)任鏈模式。一般來說,日常開發(fā)中不純的責(zé)任鏈模式用的比較多一點(diǎn)。參考責(zé)任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責(zé)任鏈(Chain of Responsibility)模式的: 責(zé)任鏈模式是一種對(duì)象的行為模式。在責(zé)任鏈模式里,...
時(shí)間: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... 第一章:責(zé)任鏈模式簡(jiǎn)介 1-1 課程簡(jiǎn)介 課程大綱 什么是責(zé)任鏈模式 如何實(shí)現(xiàn)責(zé)任鏈模式 責(zé)任鏈模式如何解耦 責(zé)任鏈模式的應(yīng)用 案例:...
閱讀 3693·2021-08-10 09:42
閱讀 591·2019-08-30 15:55
閱讀 889·2019-08-30 15:54
閱讀 3112·2019-08-30 13:45
閱讀 556·2019-08-29 16:23
閱讀 1990·2019-08-29 16:23
閱讀 986·2019-08-29 15:18
閱讀 2262·2019-08-29 12:57