行为型:责任链模式

发布于:2025-05-27 ⋅ 阅读:(60) ⋅ 点赞:(0)

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景

5、实践应用


1、核心思想

目的:处理某种连续的工作流,并确保业务能够被传递至相应的责任节点上得到处理。

举例

1> 报销审批流程:财务专员(1000元审批权限)​--> 财务经理(5000元审批权限)--> 财务总监(10000元审批权限)​,当前等级无权审批,则往上一等级提交

2> 请假审批流程:组长(1天审批权限)--> 经理(3天审批权限)--> HR(不限制天数),当前等级无权审批,则往上一等级提交

2、实现方式

2.1 模式结构

三种核心角色:

  • Handler(业务处理者)​:所有业务处理节点的顶层抽象,定义了抽象业务处理方法handle()并留给子类实现,其实体方法setSuccessor()(或setNextHandler,注入继任者)则用于责任链的构建
  • ConcreteHandler1、ConcreteHandler2……(业务处理者实现类)​:实际业务处理的实现类,可以有任意多个,每个都实现了handle()方法以处理自己职权范围内的业务,职权范围之外的事则传递给下一位继任者(另一个业务处理者)​。
  • Client(客户端)​:业务申请人,组装处理链,并将请求发送到链的起始点。

模式变体:

  • 纯责任链:请求必须被某个处理者处理,否则抛出异常。

  • 不纯责任链:允许请求未被处理(需在链末端添加默认处理者)。

2.2 实现案例

以请假审批流程为例:

// 1、业务处理者(抽象处理者)
public abstract class Handler {
    protected Handler nextHandler;//下一位审批人,更高级别领导

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

    public abstract void handleRequest(LeaveRequest request);
}

// 2、业务处理者实现类(具体处理者):组长、经理、HR
public class GroupLeader extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= 1) {
            System.out.println("组长批准请假" + request.getDays() + "天");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 传递给下一级
        }
    }
}

public class Manager extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getDays() <= 3) {
            System.out.println("经理批准请假" + request.getDays() + "天");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class HR extends Handler {
    @Override
    public void handleRequest(LeaveRequest request) {
        System.out.println("HR批准请假" + request.getDays() + "天");
    }
}

// 3、客户端
public class Client {
    public static void main(String[] args) {
        Handler groupLeader = new GroupLeader();
        // 组装责任链
        groupLeader.setNextHandler(manager).setNextHandler(hr);
       
        // 发送请求
        groupLeader.handleRequest(new LeaveRequest(2));
    }
}

3、优缺点分析

优点:

  • 解耦:请求发送者无需知道具体处理者,只需将请求发送到链上。

  • 动态性:可灵活调整处理者顺序或增减处理者。

  • 符合单一职责原则:每个处理者只关注自己能处理的请求。

缺点:

  • 请求未处理风险:若链未正确配置,请求可能未被任何处理者处理。

  • 性能问题:长链可能导致处理延迟。

  • 调试困难:请求传递路径复杂时,调试难度增加。

4、适用场景

  • 多级审批流程:如请假、报销审批。

  • 事件处理:如 GUI 中的事件冒泡机制。

  • 过滤器链:如 Web 框架中的请求过滤(Servlet Filter、Spring Security)。

5、实践应用

  • Java Servlet 的 FilterChain:每个过滤器决定是否将请求传递给下一个。

  • Spring MVC 的 HandlerInterceptor:拦截器链处理 HTTP 请求前后逻辑。

  • 日志框架(如 Log4j):不同日志级别由不同 Logger 处理。


网站公告

今日签到

点亮在社区的每一天
去签到