責任鏈模式
概述
責任鏈模式,在面向對象裏是一種軟件設計模式,它包含了一些命令對象和一系列的處理對象。使多個對象都有處理請求的機會,從而避免請求的發送者和接收者之間的耦合關係,這個請求沿着一條鏈下去直至處理完爲止。
角色
抽象處理者角色:定義出一個處理請求的接口,如果需要,接口中可以定義出一個方法以設定和返回下家的引用,這個角色通常是一個java抽象類或者是java的接口來實現的。
具體處理者角色:具體處理者接到請求後,可以選擇將請求處理掉,或者請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要具體處理者可以訪問下家。
優點
解耦了請求和處理,請求處理者只需要關注自己的需要的請求進行處理就好,對於不需要的請求,直接轉發給下一級處理者。
具備鏈式傳遞處理請求功能,請求發送者不需要知道鏈路中的接口,只需要等待處理結果,鏈路結構靈活,可以通過改變鏈路結構動態的新增或刪除任務。
易於增加新的處理者。
缺點
當責任鏈的鏈過長的時候,會降低請求處理的效率,處理者對象存在循環引用,可能會造成死循環,內存溢出。
不利於調試,邏輯比較複雜。
應用場景
多個對象處理同一個請求,但需要動態決定哪一個對象處理的時候。
代碼示例
/**
* 測試
*/
public class ChainofResponsibilityDemo {
public static void main(String[] args) {
Handler handlerA = new HandlerA();
Handler handlerB = new HandlerB();
handlerA.setNext(handlerB);
handlerA.getReq("AB");
}
}
/**
* 處理器抽象類
*/
abstract class Handler{
Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void getReq(String req);
}
/**
* 處理者A
*/
class HandlerA extends Handler{
@Override
public void getReq(String req) {
if (req.contains("A")) {
System.out.println(this.getClass().getSimpleName()+":處理器A處理了該請求");
}
if (this.next!=null){
this.next.getReq(req);
}
}
}
/**
* 處理者B
*/
class HandlerB extends Handler{
@Override
public void getReq(String req) {
if (req.contains("B")) {
System.out.println(this.getClass().getSimpleName()+":處理器B處理了該請求");
}
if (this.next!=null){
this.next.getReq(req);
}
}
}
console:
HandlerA:處理器A處理了該請求
HandlerB:處理器B處理了該請求