成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你對責任鏈模式的理解?應用場景?

開發 前端
責任鏈模式(Chain of Responsibility Pattern)就是某個請求需要多個對象進行處理,從而避免請求的發送者和接收之間的耦合關系.

[[436283]]

 一、是什么

責任鏈模式(Chain of Responsibility Pattern)就是某個請求需要多個對象進行處理,從而避免請求的發送者和接收之間的耦合關系

將這些對象連成一條鏈子,并沿著這條鏈子傳遞該請求,直到有對象處理它為止

職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞

常見的流程如下:

  • 發送者知道鏈中的第一個接受者,它向這個接受者發出請求
  • 每一個接受者都對請求進行分析,要么處理它,要么往下傳遞
  • 每一個接受者知道的其他對象只有一個,即它的下家對象
  • 如果沒有任何接受者處理請求,那么請求將從鏈上離開,不同的實現對此有不同的反應

二、使用

假設我們負責一個售賣手機的網站,需求的定義是:需經過分別繳納500元定金和200元定金的兩輪預訂,才能到正式購買階段

公司對于交了定金的用戶有一定的優惠政策,規則如下:

  • 繳納500元定金的用戶可以收到100元優惠券
  • 納200元定金的用戶可以收到50元優惠券
  • 而沒有繳納定金的用戶進入普通購買模式,沒有優惠券,而且在庫存不足的情況下,不一定能保證買得到

下面開始設計幾個字段,解釋它們的含義:

  • orderType:表示訂單類型,值為1表示500元定金用戶,值為2表示200元定金用戶,值為3表示普通用戶。
  • pay:表示用戶是否支付定金,值為布爾值true和false,就算用戶下了500元定金的訂單,但是如果沒有支付定金,那也會降級為普通用戶購買模式。
  • stock:表示當前用戶普通購買的手機庫存數量,已經支付過定金的用戶不受限制。

代碼實現如下:

  1. const order = function (orderType, pay, stock) { 
  2.   if (orderType === 1) { 
  3.     if (pay === true) { 
  4.       console.log('500元定金預購,得到100元優惠券'
  5.     } else { 
  6.       if (stock > 0) { 
  7.         console.log('普通用戶購買,無優惠券'
  8.       } else { 
  9.         console.log('手機庫存不足'
  10.       } 
  11.     } else if (orderType === 2) { 
  12.       if (pay === true) { 
  13.         console.log('200元定金預購,得到50元優惠券'
  14.       } else { 
  15.         if (stock > 0) { 
  16.           console.log('普通用戶購買,無優惠券'
  17.         } else { 
  18.           console.log('手機庫存不足'
  19.         } 
  20.       } 
  21.     } else if (orderType === 3) { 
  22.       if (stock > 0) { 
  23.           console.log('普通用戶購買,無優惠券'
  24.         } else { 
  25.           console.log('手機庫存不足'
  26.       }  
  27.   } 
  28.  
  29. order(1, true, 500)  // 輸出:500元定金預購,得到100元優惠券' 

可以看到上述代碼大量實用化if...else,難以閱讀,維護起來也很困難

如果進行優化,則可以把500元訂單、200元訂單以及普通購買拆分成三個函數,如下:

  1. function order500 (orderType, pay, stock) { 
  2.   if (orderType === 1 && pay === true) { 
  3.     console.log('500元定金預購,得到100元優惠券'
  4.   } else { 
  5.     order200(orderType, pay, stock) 
  6.   } 
  7.  
  8. function order200 (orderType, pay, stock) { 
  9.   if (orderType === 2 && pay === true) { 
  10.     console.log('200元定金預購,得到50元優惠券'
  11.   } else { 
  12.     order200(orderType, pay, stock) 
  13.   } 
  14.  
  15. function orderNormal (orderType, pay, stock) { 
  16.   if (stock > 0) { 
  17.     console.log('普通用戶購買,無優惠券'
  18.   } else { 
  19.     console.log('手機庫存不足'
  20.   } 
  21.  
  22. // 測試 
  23. order500(1, true, 500)  // 500元定金預購,得到100元優惠券 
  24. order500(1, false, 500)  // 普通用戶購買,無優惠券 
  25. order500(2, true, 500)  // 200元定金預購,得到50元優惠券 
  26. order500(3, false, 500)  // 普通用戶購買,無優惠券 
  27. order500(3, false, 0)   // 手機庫存不足 

上述過程中,請求在鏈條中傳遞的順序很僵硬,傳遞請求的代碼跟業務代碼耦合在一起,如果有一天要增加300元定金的預訂,那么就要切斷之前的鏈條,修改訂單500函數的代碼,重新在500和200之間加一根新的鏈條,這違反了開放-封閉原則

因此需要靈活更改責任鏈節點,如果不能處理的時候,則返回一個標識繼續往后傳遞,如下:

  1. function order500 (orderType, pay, stock) { 
  2.   if (orderType === 1 && pay === true) { 
  3.     console.log('500元定金預購,得到100元優惠券'
  4.   } else { 
  5.     return 'nextSuccessor' 
  6.   } 
  7.  
  8. function order200 (orderType, pay, stock) { 
  9.   if (orderType === 2 && pay === true) { 
  10.     console.log('200元定金預購,得到50元優惠券'
  11.   } else { 
  12.     return 'nextSuccessor' 
  13.   } 
  14.  
  15. function orderNormal (orderType, pay, stock) { 
  16.   if (stock > 0) { 
  17.     console.log('普通用戶購買,無優惠券'
  18.   } else { 
  19.     console.log('手機庫存不足'
  20.   } 

下面再創建一個鏈類,將訂單優惠函數傳入鏈類中,如下:

  1. class Chain { 
  2.   construct (fn) { 
  3.     this.fn = fn 
  4.     this.successor = null 
  5.   } 
  6.  
  7.   setNextSuccessor (successor) { 
  8.     return this.successor = successor 
  9.   } 
  10.  
  11.   passRequest () { 
  12.     const res = this.fn.apply(this, arguments) 
  13.  
  14.     if (res === 'nextSuccessor') { 
  15.       return this.successor && this.successor.passRequest.apply(this.successor, arguments) 
  16.     } 
  17.     return res 
  18.   } 
  19.  
  20. // 包裝三個訂單函數 
  21. const chainOrder500 = new Chain(order500) 
  22. const chainOrder200 = new Chain(order200) 
  23. const chainOrderNormal = new Chain(orderNormal) 
  24.  
  25. // 指定節點在職責鏈中的位置 
  26. chainOrder500.setNextSuccessor(chainOrder200) 
  27. chainOrder200.setNextSuccessor(chainOrderNormal) 
  28.  
  29. // 最后把請求傳遞給第一個節點 
  30. chainOrder500.passRequest(1, true, 500)   // 500元定金預購,得到100元優惠券 
  31. chainOrder500.passRequest(2, true, 500)   // 200元定金預購,得到50元優惠券 
  32. chainOrder500.passRequest(3, true, 500)   // 普通用戶購買,無優惠券 
  33. chainOrder500.passRequest(1, false, 0)    // 手機庫存不足 

三、應用場景

責任鏈模式比較適合比如一個任務需要多個對象才能完成處理的情況或者代碼存在許多if-else判斷的情況,例如OA事件審批、分配開發任務等

在JavaScript中,無論是作用鏈、原型鏈,還是DOM節點中的事件冒泡,我們都能從中找到職責鏈的影子

使用了職責鏈模式之后,鏈中的節點對象可以靈活地拆分重組,增加、刪除和修改節點在鏈中的位置都是很容易的事

參考文獻

https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

https://juejin.cn/post/6993948920929845279

https://juejin.cn/post/6844903855348514829

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-11-05 07:47:56

代理模式對象

2021-11-09 08:51:13

模式命令面試

2021-11-10 07:47:49

組合模式場景

2021-11-03 14:10:28

工廠模式場景

2021-11-11 16:37:05

模板模式方法

2021-09-16 07:52:18

算法應用場景

2021-08-16 08:33:26

git

2021-11-04 06:58:32

策略模式面試

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-28 07:12:09

測試路徑

2021-09-29 07:24:20

場景數據

2021-09-10 06:50:03

TypeScript裝飾器應用

2021-10-08 09:59:32

冒泡排序場景

2021-10-13 18:01:33

快速排序場景

2021-10-09 10:25:41

排序應用場景

2021-09-08 07:49:34

TypeScript 泛型場景

2021-06-01 08:25:06

Node.jsJavaScript運行

2021-05-31 10:35:34

TCPWebSocket協議

2021-10-18 07:51:39

回溯算法面試

2021-10-12 07:15:02

歸并排序場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区高清在线观看 | 日韩美女爱爱 | 国产色播av在线 | 亚洲欧洲成人在线 | 亚洲精品乱码久久久久v最新版 | 精品自拍视频在线观看 | 成人在线免费看 | 欧美中文字幕在线观看 | 97视频在线观看免费 | 色婷婷av一区二区三区软件 | 中文字幕av高清 | 久久精品国产一区二区三区 | 久久久91精品国产一区二区三区 | 天堂一区二区三区 | 在线不卡视频 | 亚洲三区在线 | 中文字幕av中文字幕 | 欧美激情久久久 | 欧美日韩视频在线第一区 | 免费播放一级片 | 日韩在线欧美 | 欧美日韩在线一区二区 | 日韩欧美一区二区在线播放 | 欧美激情精品久久久久久 | 免费国产精品久久久久久 | 久视频在线 | 四虎永久在线精品免费一区二 | 成人午夜av | 综合自拍 | 国产精品99久久久久久人 | 一区二区手机在线 | 美日韩精品 | 亚洲欧美国产毛片在线 | 久久久九九 | 久久99视频免费观看 | 日本一区二区三区免费观看 | 成人欧美一区二区三区在线观看 | 久久精彩视频 | 国产精品久久国产精品 | 逼逼网| 在线观看av网站永久 |