職責鏈模式
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。
責任鏈模式降低了請求的發送端和接收端之間的耦合,使多個對象都有機會處理這個請求。
角色
- 抽象處理者(Handler)角色
定義出一個處理請求的接口。 如果需要,接口可以定義出一個方法,以設定和返回對下家的引用。這個角色 通常由一個抽象類或接口實現。 - 具體處理者(ConcreteHandler)角色
具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。
由於具體處理者持有對下家的引用,因此,如果需要, 具體處理者可以訪問下家。
本質
- 分離職責,動態組合
優點
- 請求者和接收者鬆散耦合
- 動態組合職責
缺點
- 產生很多細粒度對象
- 不一定能被處理
需要提供默認處理
處理請示的接口:
public class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor=successor;
}
public void HandleRequest(int request) {}
}
具體處理請求的類:
public class ConcreteHandler1 extends Handler {
public void HandleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("ConcreteHandler1 處理了請求" + request);
} else if (successor != null) {
successor.HandleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler {
public void HandleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("ConcreteHandler2 處理了請求" + request);
} else if (successor != null) {
successor.HandleRequest(request);
}
}
}
public class ConcreteHandler3 extends Handler {
public void HandleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("ConcreteHandler3 處理了請求" + request);
} else if (successor != null) {
successor.HandleRequest(request);
}
}
}
測試類:
public class Main {
public static void main(String[] args) {
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setSuccessor(h3);
h3.setSuccessor(h2);
int[] requests = {1, 2, 3, 11, 12, 13, 21, 22, 23, 99};
for (int request : requests) {
h1.HandleRequest(request);
}
}
}