责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这个模式将请求的处理者连接成一条链,沿着这条链传递请求,直到某个处理者处理它为止。
责任链模式的主要角色:
- 抽象处理者(Handler): 定义处理请求的接口,通常包含一个处理请求的抽象方法和一个指向下一个处理者的引用(即责任链中的下一个处理者)。
- 具体处理者(ConcreteHandler): 继承自抽象处理者,实现具体的处理逻辑。如果它能处理这个请求,它就处理,否则将请求传递给下一个处理者。
- 客户端(Client): 创建处理链并将请求传递给责任链的第一个处理者。
责任链模式的核心思想:
请求沿着责任链传递,直到某个处理者处理它或请求到达链的末尾。如果链上的一个对象无法处理请求,它会将请求传递给链中的下一个对象。
优点:
- 降低耦合度: 请求的发送者不需要知道是哪一个处理者处理了请求。
- 增强灵活性: 可以根据需要动态地添加、修改或删除处理者。
- 责任分担: 各个处理者只负责处理自己能处理的部分,其他部分交给后续处理者。
缺点:
- 调试困难: 如果链过长,调试时难以追踪请求的处理过程。
- 性能开销: 请求从链的头部传递到尾部,可能需要遍历整个链,增加了性能开销。
责任链模式的应用场景:
- 权限过滤: 在系统中进行权限检查时,多个处理者可以根据不同的权限级别进行处理。
- 事件处理: 在GUI系统中,事件(如点击事件)可能需要在多个处理者之间传递,直到某个处理者处理它。
- 日志处理: 系统日志可以根据不同的日志级别传递到不同的处理者。
示例
代码
// 抽象处理者,定义了处理请求的方法和设置下一个处理者的方法
abstract class Approver {
protected Approver nextApprover; // 下一个处理者
public void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
public abstract void approveRequest(int amount);
}
// 具体处理者:组长,可以审批额度在1000元以下的请求
public class TeamLeader extends Approver {
@Override
public void approveRequest(int amount) {
if (amount <= 1000) {
System.out.println("组长批准了" + amount + "元的费用报销请求。");
} else if (nextApprover != null) {
System.out.println("组长无法批准" + amount + "元的请求,交由上级处理...");
nextApprover.approveRequest(amount);
}
}
}
// 具体处理者:经理,可以审批额度在5000元以下的请求
public class Manager extends Approver {
@Override
public void approveRequest(int amount) {
if (amount <= 5000) {
System.out.println("经理批准了" + amount + "元的费用报销请求。");
} else if (nextApprover != null) {
System.out.println("经理无法批准" + amount + "元的请求,交由上级处理...");
nextApprover.approveRequest(amount);
}
}
}
// 具体处理者:总监,可以审批额度在10000元以下的请求
public class Director extends Approver {
@Override
public void approveRequest(int amount) {
if (amount <= 10000) {
System.out.println("总监批准了" + amount + "元的费用报销请求。");
} else if (nextApprover != null) {
System.out.println("总监无法批准" + amount + "元的请求,交由上级处理...");
nextApprover.approveRequest(amount);
} else {
System.out.println("请求" + amount + "元的报销费用过高,无法批准。");
}
}
}
//客户端
public class TestChainOfResponsibilityPattern {
public static void main(String[] args) {
// 创建责任链上的处理者
Approver teamLeader = new TeamLeader();
Approver manager = new Manager();
Approver director = new Director();
// 设置责任链
teamLeader.setNextApprover(manager); // 组长的下一个处理者是经理
manager.setNextApprover(director); // 经理的下一个处理者是总监
// 模拟报销请求
System.out.println("处理100元的请求:");
teamLeader.approveRequest(100);
System.out.println();
System.out.println("处理3000元的请求:");
teamLeader.approveRequest(3000);
System.out.println();
System.out.println("处理8000元的请求:");
teamLeader.approveRequest(8000);
System.out.println();
System.out.println("处理15000元的请求:");
teamLeader.approveRequest(15000);
}
}
解释:
使用责任链模式在处理费用报销请求时的应用。通过设置不同级别的处理者(组长、经理和总监),不同额度的报销请求可以根据责任链传递到合适的审批人。如果当前处理者无法处理请求,则将请求传递给链中的下一个处理者。
标签:传递,请求,处理,Approver,模式,责任 From: https://www.cnblogs.com/20lxj666/p/18396293