目錄
定義
責任鏈模式(Chain of Responsibility)是一種對象的行為模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
責任鏈的定義有些抽象,其實就是使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系,將這些對象形成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。就像我們上學時在班級上傳遞小紙條一樣,一個同學傳遞給另一個同學,如果是傳給該同學的那么該同學接受,傳遞終止,否則傳遞給下一個同學。在這其中一個一個的同學組成一條鏈,在這條鏈上的每個同學都有可能接收紙條(處理請求),如果一個同學要傳遞給下一個同學就要知道同學的名字(引用)。
使用場景
- 多個對象能夠處理同一請求,具體處理則在運行時動態確定
- 在請求矗立著不明確的時候向多個對象提交同一個請求
- 需要動態制定一組對象處理請求
代碼運用
- 抽象處理者(Handler)角色:定義出一個處理請求的接口。可以定義 出一個方法以設定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現。
public abstract class Handler {
public Handler nextHandler;
public void handleRequest(Request request){
if(getHandleLevel()==request.getRequestLevel())
{
handle(request);
}else {
if(nextHandler!=null)
{
nextHandler.handleRequest(request);
}else {
System.out.println("----> 所有的處理對象都不能處理它");
}
}
}
/**
* 每個處理者的對象的具體處理方式
* @param Request
*/
public abstract void handle(Request request);
/**
* 每個處著對象處理的級別
* @return
*/
public abstract int getHandleLevel();
}
//請求的抽象封裝類
public abstract class Request {
private Object object;
public Request(Object object){
this.object=object;
}
/**
* 具體的內容對象
* @return
*/
public Object getContent(){
return object;
}
/**
* 獲取請求級別
*/
public abstract int getRequestLevel();
}
- 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下一個對象。由于具體處理者持有對下一個對象的引用,因此,如果需要,具體處理者可以訪問下一個對象。
public class ConcreteHandler extends Handler{
@Override
public void handle(Request request) {
System.out.println("----handle1 處理請求: "+request.getRequestLevel());
}
@Override
public int getHandleLevel() {
return 1;
}
}
-
發送者發送請求
public class Client { public static void main(String[] args) { //確定鏈式關系 Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); Handler handler3=new ConcreteHandler3(); handler1.nextHandler=handler2; handler2.nextHandler=handler3; //建立請求 Request request=new Request("請求1"); handler1.handleRequest(request); } }
首先由handler1處理請求,如果請求不是給它的,就會傳遞下一個(handler2)因為handler1有handler2的引用( handler1.nextHandler=handler2)。