Skip to content

责任链模式

责任链设计模式(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);
    }
}

Released under the MIT License.