設計模式-職責鏈模式
職責鏈模式概述
職責鏈模式(Chain of Responsibility)是一種行為型設計模式,它通過為多個對象提供處理請求的機會,從而避免請求的發送者與接收者耦合。職責鏈模式將這些對象連成一條鏈,并沿著鏈傳遞請求,直到有對象處理它為止。
職責鏈模式的角色
- 抽象處理者(Handler):定義處理請求的接口,并包含設置下一個處理者的引用。
- 具體處理者(ConcreteHandler):實現抽象處理者,具體處理請求或將請求傳遞給下一個處理者。
- 客戶端(Client):創建處理鏈并向處理鏈發送請求。
示例:權限審批
假設有一個系統中,需要按照審批權限的不同來處理審批請求:
- 部門經理審批小額預算。
- 總經理審批中等預算。
- 董事會審批高額預算。
Java 實現代碼
// 抽象處理者
abstract class Approver {
protected Approver nextApprover; // 下一個處理者
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
// 抽象方法:處理請求
public abstract void handleRequest(int amount);
}
// 部門經理
class Manager extends Approver {
@Override
public void handleRequest(int amount) {
if (amount <= 1000) {
System.out.println("部門經理批準了" + amount + "元的預算請求。");
} else if (nextApprover != null) {
nextApprover.handleRequest(amount);
}
}
}
// 總經理
class GeneralManager extends Approver {
@Override
public void handleRequest(int amount) {
if (amount <= 10000) {
System.out.println("總經理批準了" + amount + "元的預算請求。");
} else if (nextApprover != null) {
nextApprover.handleRequest(amount);
}
}
}
// 董事會
class BoardOfDirectors extends Approver {
@Override
public void handleRequest(int amount) {
if (amount > 10000) {
System.out.println("董事會批準了" + amount + "元的預算請求。");
} else if (nextApprover != null) {
nextApprover.handleRequest(amount);
}
}
}
// 客戶端
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
// 創建處理者
Approver manager = new Manager();
Approver generalManager = new GeneralManager();
Approver board = new BoardOfDirectors();
// 構建職責鏈
manager.setNextApprover(generalManager);
generalManager.setNextApprover(board);
// 模擬請求
System.out.println("請求1:500元");
manager.handleRequest(500);
System.out.println("\n請求2:5000元");
manager.handleRequest(5000);
System.out.println("\n請求3:20000元");
manager.handleRequest(20000);
}
}
輸出結果
請求1:500元
部門經理批準了500元的預算請求。
請求2:5000元
總經理批準了5000元的預算請求。
請求3:20000元
董事會批準了20000元的預算請求。
職責鏈模式的優點
- 降低耦合度:請求發送者與接收者解耦。
- 動態組合:職責鏈可以動態地增加或修改處理者。
職責鏈模式的缺點
- 性能問題:鏈過長時,可能導致性能下降。
- 調試困難:鏈中節點的增刪修改可能引發問題。
職責鏈模式在現實開發中常用于權限校驗、事件處理等場景,幫助構建靈活、可擴展的系統。

浙公網安備 33010602011771號