责任链模式(Chain of Responsibility Pattern)

1. 概念

责任链模式是一种行为设计模式,它允许将请求沿着处理者链传递,直到有处理者处理它或者链的末端。每个处理者都持有对下一个处理者的引用,并可以选择处理请求或将其传递给下一个处理者。

2. 适用场景

  • 需要多个对象处理同一请求,但不希望明确指定具体处理者。
  • 处理者需要灵活组合,支持动态添加或移除。
  • 需要避免请求的发送者和接收者之间的耦合。

3. 结构

责任链模式主要由以下角色组成:

  • 抽象处理者(Handler):定义处理请求的接口,并持有下一个处理者的引用。
  • 具体处理者(Concrete Handler):实现抽象处理者接口,决定是否处理请求,如果不处理则传递给下一个处理者。
  • 客户端(Client):创建请求并发送到处理链的起点。

4. 示例代码(Java 实现)

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

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

    public abstract void handleRequest(int request);
}

// 具体处理者A
class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("HandlerA 处理了请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者B
class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 20) {
            System.out.println("HandlerB 处理了请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者C
class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20) {
            System.out.println("HandlerC 处理了请求:" + request);
        }
    }
}

// 测试代码
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 构建责任链:A -> B -> C
        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);

        // 发送不同请求
        int[] requests = {5, 15, 25};
        for (int req : requests) {
            handlerA.handleRequest(req);
        }
    }
}

5. 运行结果:

HandlerA 处理了请求:5
HandlerB 处理了请求:15
HandlerC 处理了请求:25

6. 责任链模式的优缺点

优点:

  • 降低耦合度,发送者和接收者解耦。
  • 符合开闭原则,可以动态添加新的处理者。
  • 增强系统的灵活性,可动态改变责任链结构。

缺点:

  • 请求可能会遍历整个责任链,影响性能。
  • 责任链过长可能导致调试困难。
  • 可能导致部分请求未被处理(如果没有默认处理者)。

7. 责任链模式在实际开发中的应用

  • 日志处理(不同级别的日志过滤,如 INFO、WARN、ERROR)
  • 权限控制(不同层级的权限认证)
  • 审批流程(如请假审批,先部门主管审批,再 HR 审批)
  • 中间件设计(如 Servlet 过滤器、Spring 拦截器)

Categories:

Tags:

暂时没有回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注