责任链模式
责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
基本原理
在责任链模式中,通常会定义一个处理请求的接口,然后创建多个实现了该接口的处理器类。每个处理器类都可以决定是否处理请求,如果能处理则处理之,否则将请求传递给链中的下一个处理器。链的末端通常有一个默认处理器,用于处理那些前面所有处理器都无法处理的请求。
类图
主要角色
- 抽象处理者(Handler):定义一个处理请求的接口,并且包含一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler):继承抽象处理者类,实现处理请求的具体逻辑。如果不能处理当前请求,就将请求传递给下一个处理者。
- 客户端(Client):创建并配置责任链。
优缺点
优点
- 降低耦合度:请求的发送者和接收者可以互不影响。
- 扩展性强:增加新的处理类非常方便。
缺点
- 调试困难:由于请求是在责任链中传递,调试和测试变得困难。
- 性能问题:如果链条过长,可能会导致性能问题。
示例
java
abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(Request request);
}
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeA")) {
System.out.println("Handler A handled the request.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeB")) {
System.out.println("Handler B handled the request.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeC")) {
System.out.println("Handler C handled the request.");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
class Request {
private String type;
public Request(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
public class Client {
public static void main(String[] args) {
// 创建处理者
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
// 设置责任链
handlerA.setNextHandler(handlerB);
handlerB.setNextHandler(handlerC);
// 创建请求
Request requestA = new Request("TypeA");
Request requestB = new Request("TypeB");
Request requestC = new Request("TypeC");
Request requestD = new Request("TypeD");
// 处理请求
handlerA.handleRequest(requestA);
handlerA.handleRequest(requestB);
handlerA.handleRequest(requestC);
handlerA.handleRequest(requestD);
}
}