文章摘要: 责任链模式使用总结。
简介
简要说明
- 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式。
- 将请求的发送者和接收者解耦,将多个接收者连成一条链,并沿着这条链传递请求,直到链上的某个接收者处理这个请求。
主要功能
- 分发请求到多个对象。
- 避免请求发送者和接收者之间的耦合。
- 增加新的处理者无需修改现有代码。
注意事项
- 链中的处理者对象数量可能会影响性能。
- 如果请求在链的末端没有被处理,需要有一个明确的结束条件。
- 避免责任链过长,否则可能会造成调试困难。
适用场景
- 当多个对象可以处理同一个请求,但具体由哪个对象处理在运行时动态决定时。
- 当你想在不明确指定接收者的情况下,向多个对象中的一个提交请求时。
- 当处理者有多个,并且它们的责任可以按照一定的顺序排列时。
Java 8
案例
// 抽象处理者
abstract class Handler {
protected Handler successor;
// 设置后继者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
// 处理请求的方法
public abstract void handleRequest(int request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("ConcreteHandlerA 处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request); // 传递给下一个处理者
}
}
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("ConcreteHandlerB 处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request); // 传递给下一个处理者
}
}
}
// 客户端代码
public class ChainOfResponsibilityPatternDemo {
public static void main(String[] args) {
// 创建责任链
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setSuccessor(handlerB); // 设置后继者
// 发送请求
handlerA.handleRequest(5); // ConcreteHandlerA 处理请求
handlerA.handleRequest(15); // ConcreteHandlerB 处理请求
handlerA.handleRequest(25); // 没有处理者处理请求
}
}
注释
- 在这个例子中,
Handler是一个抽象类,定义了处理请求的方法handleRequest和一个设置后继者的方法setSuccessor。ConcreteHandlerA和ConcreteHandlerB是具体的处理者类,它们继承自Handler类,并实现了handleRequest方法。 - 在
ChainOfResponsibilityPatternDemo的main方法中,我们创建了两个处理者对象handlerA和handlerB,并将它们设置成责任链。当请求被发送到handlerA时,如果请求的值在handlerA的处理范围内,则handlerA会处理该请求;否则,它会将请求传递给handlerB。如果请求在handlerB的处理范围内,则handlerB会处理该请求;否则,请求将不会被处理,因为没有设置更多的处理者。