責任鏈模式將請求的發送者與接收者解耦,讓多個處理者都有機會處理請求,將它們連成一條鏈,沿著鏈傳遞請求,直到有處理者處理為止。每個處理者持有對下一個處理者的引用,形成鏈式結構。
interface Handler {
void handleHelp();
void handlePrint();
void handleFormat();
}
缺點:新增請求類型需修改介面及所有實現類,違反開閉原則。
interface HelpHandler { void handleHelp(); }
interface PrintHandler { void handlePrint(); }
// 實現類需實現多個介面,構造器參數爆炸,代碼醜陋。
interface Handler {
void handleRequest(Request request);
}
class ConcreteHandler implements Handler {
private Handler successor;
public ConcreteHandler(Handler s) { this.successor = s; }
public void handleRequest(Request req) {
if (canHandle(req)) doHandle(req);
else if (successor != null) successor.handleRequest(req);
}
}
引入 Request 封裝請求類型與數據,實現統一分發。
interface Handler {
void handleRequest(Request request);
}
abstract class AbstractHandler implements Handler {
private Handler next;
public void setNext(Handler h) { this.next = h; }
public void handleRequest(Request req) {
if (canHandle(req)) doHandle(req);
else if (next != null) next.handleRequest(req);
}
protected abstract boolean canHandle(Request req);
protected abstract void doHandle(Request req);
}
各具體處理者只關注自己的業務邏輯,鏈的組裝由客戶端或構建器完成。
| 優點 | 缺點 |
|---|---|
| 降低耦合:發送者無需知道誰處理 | 性能開銷:請求可能遍歷整條鏈 |
| 靈活分發:動態調整鏈的順序/增減處理者 | 調試困難:運行時鏈結構不直觀 |
| 單一職責:每類只處理特定請求 | 可能導致請求未被處理(無默認處理者) |
適用於「處理者不固定、順序可變、請求類型擴展頻繁」的場景。注意設置「終端處理者」或「默認處理者」防止請求丟失。鏈的組裝可使用建造者模式或配置文件動態構建。