设计模式-职责链模式
职责链模式概述
职责链模式(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元的预算请求。
职责链模式的优点
- 降低耦合度:请求发送者与接收者解耦。
- 动态组合:职责链可以动态地增加或修改处理者。
职责链模式的缺点
- 性能问题:链过长时,可能导致性能下降。
- 调试困难:链中节点的增删修改可能引发问题。
职责链模式在现实开发中常用于权限校验、事件处理等场景,帮助构建灵活、可扩展的系统。