国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

每天一個(gè)設(shè)計(jì)模式之責(zé)任鏈模式

JerryWangSAP / 2116人閱讀

摘要:實(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ù)制代碼

  1. 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascriptpython兩種語言實(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ù)制代碼

  1. 責(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 -> ErrorHandlerLogHandler作為鏈的開始節(jié)點(diǎn)。

如果是普通日志,那么就由 LogHandler 處理,停止傳播;如果是 Warn 級(jí)別的日志,那么 LogHandler 就會(huì)自動(dòng)向下傳遞,WarnHandler 接收到并且處理,停止傳播;Error 級(jí)別日志同理。

3.1 ES6 實(shí)現(xiàn)

</>復(fù)制代碼

  1. class Handler {
  2. constructor() {
  3. this.next = null;
  4. }
  5. setNext(handler) {
  6. this.next = handler;
  7. }
  8. }
  9. class LogHandler extends Handler {
  10. constructor(...props) {
  11. super(...props);
  12. this.name = "log";
  13. }
  14. handle(level, msg) {
  15. if (level === this.name) {
  16. console.log(`LOG: ${msg}`);
  17. return;
  18. }
  19. this.next && this.next.handle(...arguments);
  20. }
  21. }
  22. class WarnHandler extends Handler {
  23. constructor(...props) {
  24. super(...props);
  25. this.name = "warn";
  26. }
  27. handle(level, msg) {
  28. if (level === this.name) {
  29. console.log(`WARN: ${msg}`);
  30. return;
  31. }
  32. this.next && this.next.handle(...arguments);
  33. }
  34. }
  35. class ErrorHandler extends Handler {
  36. constructor(...props) {
  37. super(...props);
  38. this.name = "error";
  39. }
  40. handle(level, msg) {
  41. if (level === this.name) {
  42. console.log(`ERROR: ${msg}`);
  43. return;
  44. }
  45. this.next && this.next.handle(...arguments);
  46. }
  47. }
  48. /******************以下是測(cè)試代碼******************/
  49. let logHandler = new LogHandler();
  50. let warnHandler = new WarnHandler();
  51. let errorHandler = new ErrorHandler();
  52. // 設(shè)置下一個(gè)處理的節(jié)點(diǎn)
  53. logHandler.setNext(warnHandler);
  54. warnHandler.setNext(errorHandler);
  55. logHandler.handle("error", "Some error occur");
3.2 Python3 實(shí)現(xiàn)

</>復(fù)制代碼

  1. class Handler():
  2. def __init__(self):
  3. self.next = None
  4. def set_next(self, handler):
  5. self.next = handler
  6. class LogHandler(Handler):
  7. def __init__(self):
  8. super().__init__()
  9. self.__name = "log"
  10. def handle(self, level, msg):
  11. if level == self.__name:
  12. print("LOG: ", msg)
  13. return
  14. if self.next != None:
  15. self.next.handle(level, msg)
  16. class WarnHandler(Handler):
  17. def __init__(self):
  18. super().__init__()
  19. self.__name = "warn"
  20. def handle(self, level, msg):
  21. if level == self.__name:
  22. print("WARN: ", msg)
  23. return
  24. if self.next != None:
  25. self.next.handle(level, msg)
  26. class ErrorHandler(Handler):
  27. def __init__(self):
  28. super().__init__()
  29. self.__name = "error"
  30. def handle(self, level, msg):
  31. if level == self.__name:
  32. print("ERROR: ", msg)
  33. return
  34. if self.next != None:
  35. self.next.handle(level, msg)
  36. # 以下是測(cè)試代碼
  37. log_handler = LogHandler()
  38. warn_handler = WarnHandler()
  39. error_handler = ErrorHandler()
  40. # 設(shè)置下一個(gè)處理的節(jié)點(diǎn)
  41. log_handler.set_next(warn_handler)
  42. warn_handler.set_next(error_handler)
  43. 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

相關(guān)文章

  • 每天一個(gè)設(shè)計(jì)模式責(zé)任模式

    摘要:實(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. 什么是...

    Cciradih 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式責(zé)任模式

    摘要:實(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. 什么是...

    _Suqin 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式責(zé)任模式

    摘要:實(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. 什么是...

    Doyle 評(píng)論0 收藏0
  • JAVA設(shè)計(jì)模式責(zé)任模式

    摘要:責(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é)任鏈模式里,...

    libxd 評(píng)論0 收藏0
  • 慕課網(wǎng)_《模式的秘密責(zé)任模式》學(xué)習(xí)總結(jié)

    時(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)用 案例:...

    jsyzchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<