Java设计模式之责任链模式(Chain of Responsibility)

77 阅读2分钟

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

责任链模式包含以下几个关键角色:

  1. Handler(抽象处理者) :定义一个处理请求的接口,并且持有对下一条链的引用。
  2. ConcreteHandler(具体处理者) :实现抽象处理者角色,负责处理它所负责的请求,同时将那些不由自己处理的请求传递给链中的下一个处理者。
  3. Client(客户类) :创建链,并向链头发送请求。

责任链模式的典型代码结构如下:

// 抽象处理者
abstract class Handler {
    protected Handler nextHandler;

    public Handler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Request request);
}

// 具体处理者A
class ConcreteHandlerA extends Handler {
    public ConcreteHandlerA(Handler nextHandler) {
        super(nextHandler);
    }

    @Override
    public void handleRequest(Request request) {
        if (!canHandle(request)) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("Handled by A");
        }
    }

    private boolean canHandle(Request request) {
        // 定义A处理请求的逻辑
        return request.getType().equals("A");
    }
}

// 具体处理者B
class ConcreteHandlerB extends Handler {
    public ConcreteHandlerB(Handler nextHandler) {
        super(nextHandler);
    }

    @Override
    public void handleRequest(Request request) {
        if (!canHandle(request)) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("Handled by B");
        }
    }

    private boolean canHandle(Request request) {
        // 定义B处理请求的逻辑
        return request.getType().equals("B");
    }
}

// 请求
class Request {
    private String type;

    public Request(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

// 客户类
class Client {
    public static void main(String[] args) {
        Handler a = new ConcreteHandlerA(null);
        Handler b = new ConcreteHandlerB(a);
        b.handleRequest(new Request("A"));
        b.handleRequest(new Request("B"));
    }
}

输出结果:

Handled by A
Handled by B

责任链模式的优点包括:

  • 解耦请求者和处理者:请求的发送者和接收者之间没有直接的联系。
  • 灵活性:可以动态地添加或修改处理者,增加新的处理者不会影响现有的代码。
  • 可扩展性:可以根据需要构建不同长度的责任链。

责任链模式的缺点包括:

  • 性能问题:如果责任链过长,可能会造成性能问题。
  • 复杂性:在链中定位错误或调试可能变得更加复杂。

责任链模式适用于以下场景:

  • 当多个对象可以处理同一个请求,而具体由哪个对象处理该请求应由运行时刻自动确定。
  • 当想通过一个统一的接口来隐藏这些处理者的具体实现细节时。
  • 当需要在运行时动态地改变处理者之间的处理顺序或责任分配时。