tft每日頭條

 > 圖文

 > 公鍊開發實戰

公鍊開發實戰

圖文 更新时间:2025-02-08 14:22:03

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

想象一下,您正在開發一個在線訂購系統。您希望僅授權用戶訪問系統。因此,您在訂單進入訂購系統之前添加了檢查。随着時間的推移,您添加了更多檢查,包括驗證請求數據、來自同一 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

何時應用責任鍊設計模式

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

責任鍊設計模式的優點

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

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

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved