1. 程式人生 > >設計模式:責任鏈模式

設計模式:責任鏈模式

web應用開發 軟件 ignore AS 對象 rec ons return 3D

責任鏈模式(ChainOfResponsibilityPattern)屬於 行為型模式的一種,將請求沿著一條鏈傳遞,直到該鏈上的某個對象處理它為止。
概述

定義如下:一個請求有多個對象來處理,這些對象形成一條鏈,根據條件確定具體由誰來處理,如果當前對象不能處理則傳遞給該鏈中的下一個對象,直到有對象處理它為止。 責任鏈模式通過將請求和處理分離開來,以進行解耦。職責鏈模式結構的核心在於引入了一個抽象處理者。

UML結構圖
技術分享圖片

案例
1.定義 AbstractHandler(抽象處理者),使子類形成一條鏈
public abstract class AbstractHandler {
private AbstractHandler handler ;

public AbstractHandler getHandler() {
return handler;
}

public void setHandler(AbstractHandler handler) {
this.handler = handler;
}
public abstract void handleRequest(String condition);
}
2.創建若幹個 ConcreteHandler(具體處理者)繼承 AbstractHandler,在當前 處理者對象無法處理時,將執行權傳給下一個 處理者對象
public class ConcreteHandlerA extends AbstractHandler {
@Override
public void handleRequest(String condition) {
if (condition.equalsIgnoreCase("A")) {
System.out.println("ConcreteHandlerA處理");
} else {
System.out.println("ConcreteHandlerA不處理,由其他的Handler處理");
super.getHandler().handleRequest(condition);
}
}
}
public class ConcreteHandlerB extends AbstractHandler {
@Override
public void handleRequest(String condition) {
if (condition.equalsIgnoreCase("B")) {
System.out.println("ConcreteHandlerB處理");
} else {
System.out.println("ConcreteHandlerB不處理,由其他的Handler處理");
super.getHandler().handleRequest(condition);
}
}
}
public class ConcreteHandlerC extends AbstractHandler {

@Override
public void handleRequest(String condition) {
System.out.println("ConcreteHandlerC處理");

}
}
3.創建 ChainClient(測試類)
public static void main(String args[]) {
ConcreteHandlerA concreteHandlerA = new ConcreteHandlerA();
ConcreteHandlerB concreteHandlerB = new ConcreteHandlerB();
ConcreteHandlerC concreteHandlerC = new ConcreteHandlerC();
concreteHandlerA.setHandler(concreteHandlerB);
concreteHandlerB.setHandler(concreteHandlerC);
concreteHandlerA.handleRequest("d");
}
運行效果
ConcreteHandlerA不處理,由其他的Handler處理
ConcreteHandlerB不處理,由其他的Handler處理
ConcreteHandlerC處理
總結
職責鏈模式通過建立一條鏈來組織請求的處理者,請求將沿著鏈進行傳遞,請求發送者無須知道請求在何時、何處以及如何被處理,實現了請求發送者與處理者的解耦。在軟件開發中,如果遇到有多個對象可以處理同一請求時可以應用職責鏈模式,例如在Web應用開發中創建一個過濾器(Filter)鏈來對請求數據進行過濾,在工作流系統中實現公文的分級審批等等,使用職責鏈模式可以較好地解決此類問題。
優點
降低耦合度,分離了請求與處理,無須知道是哪個對象處理其請求
簡化對象的相互連接,僅保持一個指向後者的引用,而不需保持所有候選接受者的引用
擴展容易,新增 具體請求處理者,只需要在客戶端重新建鏈即可,無需破壞原代碼
缺點
如果請求沒有明確的接收者,那麽就不能保證它一定會被處理,該請求可能一直到鏈的末端都得不到處理;一個請求也可能因職責鏈沒有被正確配置而得不到處理
較長的職責鏈,請求的處理可能涉及到多個處理對象,系統性能將受到一定影響,而且在進行代碼調試時不太方便。
如果建鏈不當,可能會造成循環調用,將導致系統陷入死循環。

設計模式:責任鏈模式