一 责任链模式
责任链模式(Chain of Responsibility Pattern)是属于行为型的设计模式,它通过将请求沿着对象链传递直到全部的对象处理完为止,使得每个接收者对象都有机会处理请求。这种模式允许对请求的处理解耦,并且让多个对象可以参与处理过程。
角色与结构:
1 Handler(抽象处理器):
- 定义了处理请求的接口,通常包含两个方法:
setNext(Handler)
用于设置下一个处理器,以及handleRequest(Request)
用于处理请求。
2 ConcreteHandler(具体处理器):
- 是 Handler 接口的实现类,每个 ConcreteHandler 都负责处理某种特定类型的请求。
- 每个 ConcreteHandler 在处理请求时,可以根据请求的具体内容选择自己处理还是将请求传递给下一个处理器。
工作原理:
- 当一个请求发送到责任链的第一个处理器时,该处理器首先检查是否能够处理这个请求。如果可以,就进行处理并结束流程;如果不能,就将请求传递给下一个处理器,以此类推,直到找到能够处理该请求的处理器,或者到达链的末端。
示例代码:
责任链java实现示例代码:
// 抽象处理器
public abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
public abstract void handleRequest(int request);
}
// 具体处理器A
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request < 10) { // 处理小于10的请求
System.out.println("ConcreteHandlerA handled request: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request); // 将大于等于10的请求转发给下一个处理器
}
}
}
// 具体处理器B
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request < 20 && nextHandler == null) { // 处理10到19的请求
System.out.println("ConcreteHandlerB handled request: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request); // 将大于等于20的请求转发给下一个处理器
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setNextHandler(handlerB);
handlerA.handleRequest(5); // 输出 "ConcreteHandlerA handled request: 5"
handlerA.handleRequest(15); // 输出 "ConcreteHandlerB handled request: 15"
handlerA.handleRequest(30); // 因为没有后续处理器,所以不会有任何输出
}
}
说明:在上面的代码中当客户端发起一个请求时,请求首先被 ConcreteHandlerA
处理。如果请求值小于10,由 ConcreteHandlerA
直接处理;否则,请求会被转发给 ConcreteHandlerB
。若请求值仍然不在 ConcreteHandlerB
的处理范围内且没有后续处理器,请求将不再继续传递。
优点:
- 松散耦合:请求者和处理器之间不直接相互依赖,它们通过责任链间接交互。
- 灵活扩展:可以很容易地在系统运行时动态添加或删除处理器节点。
- 可重用性:每个处理器可以独立于其他处理器被复用。
应用场景:
- 权限系统中权限级别的审批流,如低级别管理员无法处理的请求会自动转交给高级别管理员。
- 日志记录系统,不同严重级别的日志可能会被不同的处理器处理。
- GUI 中事件处理机制,例如鼠标点击事件可能依次触发一系列组件上的事件处理器。