設計模式的使用是將元數據從邏輯代碼中剝離出來,避免因元數據(Metadata)變化導致修改程序。程序本身只是邏輯的集合,而元數據(輔助程序行爲,諸如語言包文件)應集中在配置文件裏;待處理的數據來自外部輸入(用戶輸入、本地文件、數據庫等)
責任鏈模式屬於行爲模式中的一種,特別關注對象之間的通信。主要解決職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。
責任鏈的優點接受者和發送者都沒有對方的信息,且鏈中的自己也不知道整個鏈的結構,他們僅需保持一個指向其後繼者的引用。這大大降低了耦合度。還可以隨時隨地增加或者修改一個請求的結構,增強了靈活性和擴展性。基於這樣的框架,它的代碼總量也許比原來的要多,但你不再需要在一堆if else中仔細推敲代碼執行的前提條件。
// 定義一個處理請求的接口
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) { // 設置下一個處理者
this.successor = successor;
}
public abstract void HandlerRequest(int request); // 請求處理邏輯
}
public class ConcreteHandler1 extends Handler {
@Override
public void HandlerRequest(int request) {
if (request >= 0 && request <= 10) {
System.out.println("ConcreteHandler1 處理0到10的請求 request = " + request);
} else {
successor.HandlerRequest(request); // 將請求發送給下一位
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void HandlerRequest(int request) {
if (request > 10 && request <= 20) {
System.out.println("ConcreteHandler2 處理10到20的請求 request = " + request);
} else {
successor.HandlerRequest(request); // 將請求發送給下一位
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void HandlerRequest(int request) {
if (request > 20 && request <= 50) {
System.out.println("ConcreteHandler3 處理10到20的請求 request = " + request);
} else {
System.out.println("無法處理的請求 request = " + request);
}
}
}
public class Test {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
// 設置責任鏈的下家
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
int[] request = {2,4,3,6,20,10,40,3015,19,63,84};
for (int i : request) {
handler1.HandlerRequest(i);
}
}
}
測試結果
ConcreteHandler1 處理0到10的請求 request = 2
ConcreteHandler1 處理0到10的請求 request = 4
ConcreteHandler1 處理0到10的請求 request = 3
ConcreteHandler1 處理0到10的請求 request = 6
ConcreteHandler2 處理10到20的請求 request = 20
ConcreteHandler1 處理0到10的請求 request = 10
ConcreteHandler2 處理10到20的請求 request = 15
ConcreteHandler3 處理10到20的請求 request = 30
ConcreteHandler3 處理10到20的請求 request = 40
ConcreteHandler2 處理10到20的請求 request = 19
無法處理的請求 request = 63
無法處理的請求 request = 84