一北苟、定義
使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關(guān)系怕篷。將這些對象連成一條鏈历筝,并沿著這條鏈傳遞該請求,直到有對象處理它為止廊谓。
- 優(yōu)點:將請求和處理分開梳猪。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌蒸痹。兩者解耦春弥,提高系統(tǒng)的靈活性。
- 缺點:一是性能問題叠荠,每個請求都是從鏈頭遍歷到鏈尾匿沛,特別是在鏈比較長的時候,性能是一個非常大的問題榛鼎。二是調(diào)試不很方便逃呼。
二、實現(xiàn)
public class Client {
public static void main(String[] args) {
//聲明所有的處理節(jié)點
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//設(shè)置鏈中的階段順序1-->2-->3
handler1.setNext(handler2);
handler2.setNext(handler3);
//提交請求者娱,返回結(jié)果
Response response = handler1.handleMessage(new Request());
}
}
//抽象處理者
abstract class Handler {
private Handler nextHandler;
//每個處理者都必須對請求做出處理
public final Response handleMessage(Request request) {
Response response = null;
//判斷是否是自己的處理級別
if (null!=this.getHandlerLevel() && this.getHandlerLevel().equals(request.getRequestLevel())) {
response = this.echo(request);
} else {
//不屬于自己的處理級別
//判斷是否有下一個處理者
if (this.nextHandler != null) {
response = this.nextHandler.handleMessage(request);
} else {
System.out.println("沒有人能處理這個請求");
//沒有適當?shù)奶幚碚呗樟瑯I(yè)務(wù)自行處理
}
}
return response;
}
//設(shè)置下一個處理者是誰
public void setNext(Handler handler) {
this.nextHandler = handler;
}
//每個處理者都有一個處理級別
protected abstract Level getHandlerLevel();
//每個處理者都必須實現(xiàn)處理任務(wù)
protected abstract Response echo(Request request);
}
//具體處理者
class ConcreteHandler1 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
class ConcreteHandler2 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
class ConcreteHandler3 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
class Level {
//定義一個請求和處理等級
}
class Request {
//請求的等級
public Level getRequestLevel(){
return null;
}
}
class Response {
//處理者返回的數(shù)據(jù)
}