摘要:實現以下是測試代碼設置下一個處理的節點實現以下是測試代碼設置下一個處理的節點參考設計模式和開發實踐之責任鏈模式職責鏈模式
作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)0. 項目地址
責任鏈模式·代碼
《每天一個設計模式》地址
1. 什么是“責任鏈模式”?責任鏈模式:多個對象均有機會處理請求,從而解除發送者和接受者之間的耦合關系。這些對象連接成為鏈式結構,每個節點轉發請求,直到有對象處理請求為止。
其核心就是:請求者不必知道是誰哪個節點對象處理的請求。如果當前不符合終止條件,那么把請求轉發給下一個節點處理。
而當需求具有“傳遞”的性質時(代碼中其中一種體現就是:多個if、else if、else if、else嵌套),就可以考慮將每個分支拆分成一個節點對象,拼接成為責任鏈。
2. 優點與代價
優點
可以根據需求變動,任意向責任鏈中添加 / 刪除節點對象
沒有固定的“開始節點”,可以從任意節點開始
代價:責任鏈最大的代價就是每個節點帶來的多余消耗。當責任鏈過長,很多節點只有傳遞的作用,而不是真正地處理邏輯。
3. 代碼實現為了方便演示,模擬常見的“日志打印”場景。模擬了 3 種級別的日志輸出:
LogHandler: 普通日志
WarnHandler:警告日志
ErrorHandler:錯誤日志
首先我們會構造“責任鏈”:LogHandler -> WarnHandler -> ErrorHandler。LogHandler作為鏈的開始節點。
如果是普通日志,那么就由 LogHandler 處理,停止傳播;如果是 Warn 級別的日志,那么 LogHandler 就會自動向下傳遞,WarnHandler 接收到并且處理,停止傳播;Error 級別日志同理。
3.1 ES6 實現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(); // 設置下一個處理的節點 logHandler.setNext(warnHandler); warnHandler.setNext(errorHandler); logHandler.handle("error", "Some error occur");3.2 Python3 實現
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() # 設置下一個處理的節點 log_handler.set_next(warn_handler) warn_handler.set_next(error_handler) log_handler.handle("error", "Some error occur")4. 參考
《JavaScript 設計模式和開發實踐》
javascript 之 責任鏈模式
職責鏈模式
5.文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100775.html
摘要:實現以下是測試代碼設置下一個處理的節點實現以下是測試代碼設置下一個處理的節點參考設計模式和開發實踐之責任鏈模式職責鏈模式 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設計模式》地址 1. 什么是...
摘要:實現以下是測試代碼設置下一個處理的節點實現以下是測試代碼設置下一個處理的節點參考設計模式和開發實踐之責任鏈模式職責鏈模式 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設計模式》地址 1. 什么是...
摘要:實現以下是測試代碼設置下一個處理的節點實現以下是測試代碼設置下一個處理的節點參考設計模式和開發實踐之責任鏈模式職責鏈模式 作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 0. 項目地址 責任鏈模式·代碼 《每天一個設計模式》地址 1. 什么是...
摘要:責任鏈模式涉及到的角色如下所示抽象處理者角色定義一個處理請求的抽象類。如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。一般來說,日常開發中不純的責任鏈模式用的比較多一點。參考責任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的: 責任鏈模式是一種對象的行為模式。在責任鏈模式里,...
時間:2017年08月30日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應用 案例:...
閱讀 2595·2021-11-17 09:33
閱讀 3936·2021-10-19 11:46
閱讀 910·2021-10-14 09:42
閱讀 2252·2021-09-22 15:41
閱讀 4204·2021-09-22 15:20
閱讀 4628·2021-09-07 10:22
閱讀 2302·2021-09-04 16:40
閱讀 811·2019-08-30 15:52