首页
/
每日頭條
/
圖文
/
公鍊開發實戰
公鍊開發實戰
更新时间:2025-08-18 12:44:08

責任鍊是一種行為設計模式,可讓您沿着處理程序鍊傳遞請求。收到請求後,每個處理程序決定要麼處理請求,要麼将其傳遞給鍊中的下一個處理程序。

想象一下,您正在開發一個在線訂購系統。您希望僅授權用戶訪問系統。因此,您在訂單進入訂購系統之前添加了檢查。随着時間的推移,您添加了更多檢查,包括驗證請求數據、來自同一 IP 地址的重複失敗請求,以及在可以将請求輸入在線訂購系統之前檢查緩存響應。

當您向代碼添加更多檢查時,它會變得臃腫。

責任鍊設計模式

責任鍊涉及将某些行為轉換為稱為處理程序的獨立對象。我們應該将每個檢查提取到它自己的類中,并使用一個方法來執行它。此方法接收請求及其數據作為參數。

這種模式建議将這些處理程序鍊接在一起。在每個鍊接的處理程序中,都有一個字段用于存儲對鍊中下一個處理程序的引用。處理程序除了處理請求外,還沿着鍊傳遞請求。請求沿着鍊路由,直到所有處理程序都有機會處理它們。

此外,處理程序可以決定不将請求進一步向下傳遞,從而有效地停止進一步的處理。

公鍊開發實戰(學習責任鍊設計模式)1

UML 類圖

公鍊開發實戰(學習責任鍊設計模式)2

實施步驟

  1. 聲明處理程序接口并描述處理請求的方法的簽名。确定客戶端如何将請求數據傳遞給方法。将請求轉換為對象并将其作為參數傳遞給處理方法是最靈活的處理方式。
  2. 可能值得創建一個派生自處理程序接口的抽象處理程序類,以消除具體處理程序中的重複樣闆代碼。該類應該有一個字段用于存儲對鍊中下一個處理程序的引用。
  3. 創建具體的處理程序子類并一一實現它們的方法。當收到請求時,每個處理程序應做出兩個決定:

* 是否處理請求。

* 是否轉發請求。

4.客戶端既可以自己組裝鍊,也可以從其他對象接收預先構建的鍊。鍊中的任何處理程序都可以由客戶端觸發,而不僅僅是第一個。它将沿着鍊傳遞,直到某些處理程序拒絕進一步傳遞它或直到它到達末端。

源代碼實現

處理程序為所有具體處理程序聲明一個公共接口。它通常隻包含一個處理請求的方法,但有時它也可能包含一個設置下一個處理程序的方法。

package com.learncsdesign; public interface Handler { public void setNext(Handler handler); public void handle(number num); }

Base Handler 是一個可選類,您可以在其中放置所有處理程序類通用的樣闆代碼。 通常,此類定義一個字段來存儲對下一個處理程序的引用。

package com.learncsdesign; public abstract class BaseHandler implements Handler { private Handler next; @Override public void setNext(Handler handler) { this.next = handler; } @Override public void handle(Number num) { if (next != null) { next.handle(num); } } }

具體處理程序包含處理請求的實際代碼。 收到請求後,每個處理程序都必須決定是否處理它,此外,還要決定是否沿着鍊傳遞它。

NegativeNumberHandler 類處理負數。

package com.learncsdesign; public class NegativeNumberHandler extends BaseHandler { public void handle(Number num) { if (num.longValue() < 0) { System.out.println("Processing negative number " num.longValue()); } else { super.handle(num); } } }

PositiveNumberHandler 類處理正數。

package com.learncsdesign; public class PositiveNumberHandler extends BaseHandler { public void handle(Number num) { if (num.longValue() > 0) { System.out.println("Processing positive number " num.longValue()); } else { super.handle(num); } } }

zeroNumberHandler 類處理零數字。

package com.learncsdesign; public class ZeroNumberHandler extends BaseHandler { public void handle(Number num) { if (num.longValue() == 0) { System.out.println("Processing zero number " num.longValue()); } else { super.handle(num); } } }

客戶端可以隻組合一次鍊或動态組合它們,具體取決于應用程序的邏輯。

package com.learncsdesign; public class CoRClient { public static void main(String[] args) { Handler h1 = new PositiveNumberHandler(); Handler h2 = new NegativeNumberHandler(); Handler h3 = new ZeroNumberHandler(); h1.setNext(h2); h2.setNext(h3); h1.handle(0); h1.handle(100); h1.handle(-10); } }

// Output Processing zero number 0Processing positive number 100Processing negative number -10

何時應用責任鍊設計模式

  • 每當您的程序希望以各種方式處理不同類型的請求,但事先不知道請求的類型及其順序時,請使用責任鍊模式。
  • 當必須以特定順序執行多個處理程序時,請使用此模式。
  • 當處理程序的順序及其集合應該在運行時發生變化時,請使用此模式。

責任鍊設計模式的優點

  • 可以控制處理請求的順序。
  • 您可以将調用操作的類與執行它們的類分離。
  • 可以使用新的處理程序擴展應用程序,而不會破壞現有的客戶端代碼。

如果你喜歡這篇文章,别忘了鼓掌。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
卡地亞手表可以7天無理由退貨嗎(消費維權速報新表一次未戴卻被拒絕退貨)
卡地亞手表可以7天無理由退貨嗎(消費維權速報新表一次未戴卻被拒絕退貨)
  近日,消費者張女士向澎湃質量觀投訴平台(http://tousu.thepaper.cn)反映,2023年4月2日,她在卡地亞上海港彙恒隆精品店購買了一塊藍氣球腕表,花費45400元。次日,由于個人原因,張女士向銷售提出退貨退款。   張女士表示,自己沒有佩戴過該腕表,但退貨檢驗時,銷售告知表殼有劃痕,不符合退貨标準。當時她肉眼無法判斷是否有明顯劃痕,于...
2025-08-18
十大忌諱你知道哪些(用詞這樣百無晉忌)
十大忌諱你知道哪些(用詞這樣百無晉忌)
     “有醋可吃糠,無醋肉不香。”   —— 探員手記   歡迎加入遣詞造句1班(太原群),今天我們将教授四字詞語,零基礎同學也可以參加,晉言晉語,包教包會。   不用再擔心鍵盤上的H鍵被磨平棱角,聊天隻會發紅紅火火恍恍惚惚。   本期為你準備了太原文化人都在用的四字詞語,它們都有哪些?适合在什麼場合用?   快跟上節奏解鎖新技能,把它們打包進肚吧。  ...
2025-08-18
有話說随遇而安(小議随遇而安)
有話說随遇而安(小議随遇而安)
  #情感點評大賞#   文/王民官      《幽窗小記》中有這樣一副對聯:“寵辱不驚,閑看庭前花開花落。去留無意,漫随天外雲卷雲舒。”這句話的意思是說,為人做事能視寵辱如花開花落般平常,才能不驚;視職位去留如雲卷雲舒般變幻,才能無意。   看起來,人生雖然存滿了荊棘與挫折,教訓與失敗,但拿這句話一對照,就瞬時感覺天空飄來五個字:那都不叫事。“是事兒也就煩...
2025-08-18
玉娆和甄母現實中是親生母女嗎(為什麼隻有三小姐玉娆赢得了最終的幸福)
玉娆和甄母現實中是親生母女嗎(為什麼隻有三小姐玉娆赢得了最終的幸福)
  #頭條創作挑戰賽##我在頭條搞創作##甄嬛傳#   甄家一共三個女兒,長女甄嬛為了妹妹的家族的前途進宮選秀,成為帝王無數個女人當中的一個。次女浣碧乃是見不得光的私生子,耍了陰狠手段讓自己如願嫁給了果郡王,奈何對方心裡完全沒有她。隻有第三個女兒玉娆,她拒絕了皇帝的心意,依照自己的本心嫁給了心愛的男人慎貝勒。   為什麼甄家三姝裡隻有最小的玉娆得到了幸...
2025-08-18
巨龍咆哮卡組(巨龍咆哮龍牧歸來)
巨龍咆哮卡組(巨龍咆哮龍牧歸來)
  新版本中,牧師大部分都以恩佐斯環牧和克蘇恩牧的形态征戰天梯,而最近歐服玩家用一套微調過的龍牧卡組成功登頂歐服第一,讓我們一起來看看吧~      【卡組詳情】      【卡牌選擇】   這套牌在傳統龍牧的基礎上增加了2張古神新卡,禁忌畸變和變幻之影。   禁忌畸變:很多人覺得這張卡随機性太大,但是相對的在龍牧卡組中這張牌能帶來更多的變化。當你手中卡着一...
2025-08-18
Copyright 2023-2025 - www.tftnews.com All Rights Reserved