設計模式18——Chain of Responsibility設計模式

Chain of Responsibility(CoR)責任鏈設計模式是用一系列請求處理器試圖處理一個請求,這些請求處理器之間是一個鬆散耦合,惟一的共同點是在他們之間傳遞請求。例如客戶端發送一個請求,請求處理器A先處理,若是A沒有處理或者沒法處理,就將請求傳遞給請求處理器B,若是B沒有處理或者沒法處理,就將請求傳遞到請求處理器C去處理,全部這些請求處理器構成一條請求處理責任鏈。Chain of Responsibility責任鏈設計模式的結構以下: java

Chain of Responsibility責任鏈設計模式的時序圖以下: 設計模式


一個處理數字,字母和特殊符號的例子演示Chain of Responsibility,代碼以下: this

//抽象請求處理器
abstract class Handler{
    private Handler successor;

    public Handler(Handler successor){
        this.successor = successor;
    }

    public Handler getSuccessor(){
        return successor;
    }

    public void handRequest(Request request);
}


//Request請求類
class Request{
    private String type;

    public Request(String type){
        this.type = type;
    }

    public String getType(){
        return type;
    }
}


//數字請求處理器
class NumberHandler extends Handler{
    public NumberHandler(){ }

    public NumberHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(「Number」)){
            System.out.println(「Number has been handled」);
        }
        //傳遞到下一個請求處理器處理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


//字母請求處理器
class CharacterHandler extends Handler{
    public CharacterHandler(){ }

    public CharacterHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(「Character」)){
            System.out.println(「Character has been handled」);
        }
        //傳遞到下一個請求處理器處理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


//特殊符號請求處理器
class SymbolHandler extends Handler{
    public SymbolHandler(){ }

    public SymbolHandler(Handler successor){
        super(successor);
    }

    public void handRequest(Request request){
        if(request.getType().equals(「Symbol」)){
            System.out.println(「Symbol has been handled」);
        }
        //傳遞到下一個請求處理器處理
        else{
            getSuccessor().handRequest(request);
        }
    } 
}


public class Application{
    public static void main(String[] args){
        Handler numberHandler = new NumberHandler();
        Handler characterHandler = new CharacterHandler();
        Handler symbolHandler = new SymbolHandler();
		
        numberHandler.setSuccessor(characterHandler);
        characterHandler.setSuccessor(symbolHandler);
        Request request1 = new Request(「Number」);
        Request request2 = new Request(「Character」);
        Request request3 = new Request(「Symbol」);

        numberHandler. handRequest(request1);
        numberHandler. handRequest(request2);
        numberHandler. handRequest(request3);
    } 
}


Java中Chain of Responsibility的兩個應用例子:

(1).Java的異常處理機制,當程序中發生異常時,try-catch會比較所捕捉的異常是否符合異常類型,若是符合就執行所設定的處理,若是都沒有比對到適當的異常,就會將異常丟出try-catch區塊以外。 編碼

(2).Struts1.x中的filter過濾器鏈,Struts2.x中攔截器鏈等等,將HTTP請求處理中的字符編碼轉換,加密/解密等經常使用功能分別做爲一個個的請求處理器,接收到客戶端請求時對其進行處理,同時在向客戶端返回服務端響應時也使用這些處理器進行處理。
相關文章
相關標籤/搜索