责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。以下提供责任链模式的几个应用案例及附代码说明。

案例一:商品创建多级校验

        在商品创建流程中,通常需要对商品参数进行多级校验,如必填字段校验、规格校验、价格校验、库存校验等。使用责任链模式,可以将这些校验步骤抽离为单独的处理器类,形成一条链式调用。

UML图及代码实现
  • UML图:

    • AbstractCheckHandler:处理器抽象类,负责抽象处理器行为。
    • NullValueCheckHandler、PriceCheckHandler、StockCheckHandler等:具体处理器类,分别负责空值校验、价格校验、库存校验等。
    • HandlerClient:执行处理器链路的客户端。
    • ProductVO:创建商品的参数对象,作为多个处理器的入参。
  • 代码实现:

// 商品参数对象
@Data
@Builder
public class ProductVO {
    private Long skuId;
    private String skuName;
    private String path;
    private BigDecimal price;
    private Integer stock;
}

// 处理器抽象类
@Component
public abstract class AbstractCheckHandler {
    @Getter
    @Setter
    protected AbstractCheckHandler nextHandler;

    public abstract Result handle(ProductVO param);

    protected Result next(ProductVO param) {
        if (Objects.isNull(nextHandler)) {
            return Result.success();
        }
        return nextHandler.handle(param);
    }
}

// 空值校验处理器
@Component
public class NullValueCheckHandler extends AbstractCheckHandler {
    @Override
    public Result handle(ProductVO param) {
        // 空值校验逻辑
        if (param == null || param.getSkuId() == null || param.getSkuName() == null) {
            return Result.fail("必填字段不能为空");
        }
        return next(param);
    }
}

// 价格校验处理器(类似地,可以实现库存校验处理器等)
@Component
public class PriceCheckHandler extends AbstractCheckHandler {
    @Override
    public Result handle(ProductVO param) {
        // 价格校验逻辑
        if (param.getPrice() == null || param.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
            return Result.fail("价格必须大于0");
        }
        return next(param);
    }
}

// 客户端代码
@Service
public class HandlerClient {
    @Autowired
    private NullValueCheckHandler nullValueCheckHandler;

    @Autowired
    private PriceCheckHandler priceCheckHandler;

    // ... 其他处理器注入

    public void executeChain(ProductVO productVO) {
        // 构建责任链
        nullValueCheckHandler.setNextHandler(priceCheckHandler);
        // ... 设置其他处理器的nextHandler

        // 发起链路调用
        Result result = nullValueCheckHandler.handle(productVO);
        // 处理结果
    }
}

        注意:上述代码为简化示例,实际使用时需要根据业务需求进行扩展和修改,如动态配置处理器顺序、增加异常处理等。

案例二:请假审批流程

        在一个多级审批系统中,可以根据审批者的权限和级别将审批请求传递给下一个级别的审批者,直到获得最终的审批结果。使用责任链模式,可以灵活地配置审批流程。

代码实现
// 请假请求对象
@Getter
public class LeaveRequest {
    private final String employee;
    private final int days;

    public LeaveRequest(String employee, int days) {
        this.employee = employee;
        this.days = days;
    }
}

// 抽象处理器
public abstract class AbstractHandler {
    protected AbstractHandler nextHandler;

    public void setNextChain(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public void linkChain(LeaveRequest request) {
        handler(request);
        if (Objects.nonNull(nextHandler)) {
            nextHandler.linkChain(request);
        }
    }

    protected abstract void handler(LeaveRequest request);
}

// 具体处理器类(如部门主管、部门经理、HR等)
public class Handler1 extends AbstractHandler {
    @Override
    protected void handler(LeaveRequest request) {
        if (request.getDays() <= 3) {
            System.out.println("ConcreteHandlerA 处理了 " + request.getEmployee() + " 的请假申请,天数为:" + request.getDays());
        }
    }
}

// ... 其他处理器类(类似Handler1)

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AbstractHandler handler1 = new Handler1();
        AbstractHandler handler2 = new Handler2(); // 假设Handler2为部门经理处理器
        AbstractHandler handler3 = new Handler3(); // 假设Handler3为HR处理器

        // 构建责任链
        handler1.setNextChain(handler2);
        handler2.setNextChain(handler3);

        // 发起审批请求
        LeaveRequest request = new LeaveRequest("张三", 2);
        handler1.linkChain(request);
    }
}

        注意:上述代码为简化示例,实际使用时需要考虑异常处理、日志记录等需求。

总结

        责任链模式通过将多个处理请求的对象组成一条链,使请求在链上传递,直到有一个对象处理它为止。这种模式将请求的发送者和接收者解耦,同时提供了更大的灵活性和可扩展性。在商品创建多级校验、请假审批流程等场景中,责任链模式能够减少代码的耦合性,提高代码的可维护性和可扩展性。

更多推荐