Java学设计模式之责任链模式
一、责任链模式概念
1.1 什么是责任链模式
责任链模式是一种行为型设计模式,它允许多个对象在处理请求时依次处理,直到其中一个对象能够处理该请求为止。这些对象被连接成一条链,请求沿着链传递,直到被处理为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求的发送者需要知道具体哪个对象会处理请求的情况。
结构
责任链模式一般包含以下几个要素:
-
Handler(处理者): 定义了处理请求的接口,并且通常包含一个指向下一个处理者的引用。处理者接收到请求后,可以选择进行处理,或者将请求传递给下一个处理者。
-
ConcreteHandler(具体处理者): 实现了处理请求的具体逻辑。如果能够处理请求,就进行处理;否则将请求传递给下一个处理者。
-
Client(客户端): 创建并且发送请求给处理者对象。
二、责任链模式代码
2.1 处理者
public abstract class Approver {
protected Approver nextApprover;
protected double approvalLimit;
void setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
}
abstract void processRequest(double amount);
}
2.2 具体处理者
public class Manager extends Approver {
Manager(double approvalLimit) {
this.approvalLimit = approvalLimit;
}
@Override
void processRequest(double amount) {
if (amount <= approvalLimit) {
System.out.println("总经理批准的报销:" + amount);
} else if (nextApprover != null) {
nextApprover.processRequest(amount);
} else {
System.out.println("没有人可以处理的报销:" + amount);
}
}
}
public class VicePresident extends Approver{
VicePresident(double approvalLimit) {
this.approvalLimit = approvalLimit;
}
@Override
void processRequest(double amount) {
if (amount <= approvalLimit) {
System.out.println("副总裁批准的报销:" + amount);
} else if (nextApprover != null) {
nextApprover.processRequest(amount);
} else {
System.out.println("没有人可以处理的报销:" + amount);
}
}
}
public class President extends Approver {
President(double approvalLimit) {
this.approvalLimit = approvalLimit;
}
@Override
void processRequest(double amount) {
if (amount <= approvalLimit) {
System.out.println("总裁批准的报销:" + amount);
} else {
System.out.println("没有人可以处理的报销:" + amount);
}
}
}
2.3 测试类
public class ApproverPatternTest {
public static void main(String[] args) {
// 创建处理者对象
Manager manager = new Manager(1000);
VicePresident vicePresident = new VicePresident(5000);
President president = new President(10000);
// 构建责任链
manager.setNextApprover(vicePresident);
vicePresident.setNextApprover(president);
// 发送请求
manager.processRequest(800);
manager.processRequest(5000);
manager.processRequest(15000);
// 输出:
// 总经理批准的报销:800.0
// 副总裁批准的报销:5000.0
// 没有人可以处理的报销:15000.0
}
}
三、总结
责任链模式的优点包括:
- 将请求发送者和接收者解耦,增强了系统的灵活性。
- 允许动态地增加或修改处理者,无需修改客户端代码。
然而,责任链模式也有一些缺点:
- 请求可能会在责任链中被多次传递,直到被处理为止,这可能会影响性能。
- 如果责任链过长或者处理者对象之间存在循环引用,可能会导致系统性能下降或者请求无法被处理。