責任鍊是一種行為設計模式,可讓您沿着處理程序鍊傳遞請求。收到請求後,每個處理程序決定要麼處理請求,要麼将其傳遞給鍊中的下一個處理程序。
想象一下,您正在開發一個在線訂購系統。您希望僅授權用戶訪問系統。因此,您在訂單進入訂購系統之前添加了檢查。随着時間的推移,您添加了更多檢查,包括驗證請求數據、來自同一 IP 地址的重複失敗請求,以及在可以将請求輸入在線訂購系統之前檢查緩存響應。
當您向代碼添加更多檢查時,它會變得臃腫。
責任鍊設計模式
責任鍊涉及将某些行為轉換為稱為處理程序的獨立對象。我們應該将每個檢查提取到它自己的類中,并使用一個方法來執行它。此方法接收請求及其數據作為參數。
這種模式建議将這些處理程序鍊接在一起。在每個鍊接的處理程序中,都有一個字段用于存儲對鍊中下一個處理程序的引用。處理程序除了處理請求外,還沿着鍊傳遞請求。請求沿着鍊路由,直到所有處理程序都有機會處理它們。
此外,處理程序可以決定不将請求進一步向下傳遞,從而有效地停止進一步的處理。
UML 類圖
實施步驟
* 是否處理請求。
* 是否轉發請求。
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每日頭條,我们将持续为您更新最新资讯!