摘要:實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)實(shí)現(xiàn)以下是測(cè)試代碼設(shè)置下一個(gè)處理的節(jié)點(diǎn)參考設(shè)計(jì)模式和開發(fā)實(shí)踐之責(zé)任鏈模式職責(zé)鏈模式
</>復(fù)制代碼
作者按:《每天一個(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é)任鏈模式”?</>復(fù)制代碼
責(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)</>復(fù)制代碼
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)
</>復(fù)制代碼
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://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