Java责任链模式Demo

本文介绍了如何使用责任链模式来处理商品下单时的多阶段校验,通过创建一个对象链,每个处理器负责一个校验步骤,当任一校验失败时可以回滚到上一步。这种方式提高了代码的可扩展性和灵活性。
摘要由CSDN通过智能技术生成

责任链模式是一种行为设计模式,它允许构建一个由多个对象组成的链,每个对象都有机会处理请求,或者将请求传递给链中的下一个对象。这种模式的使用场景主要包括但不限于:日志处理、权限验证、资源分配、异常处理等

我个人使用的场景为:下单接口的验证,当一个商品下单时,要对当前订单进行一系列的校验,并且不同的校验涉及到不同的服务和逻辑,当其中任意一个校验不通过时,都会返回失败,所以将每一个校验当做每一个链,每一个链执行完后指向下一个链。

1.定义处理接口

public interface ContextHandler {
    void setNext(ContextHandler handler);
    void setPre(ContextHandler handler);
    void handle(GlobalContext param);
    void rollback(GlobalContext param);
}

2.定义全局上下文参数

@Data
public class GlobalContext {
    private String orderId;
    private String payFee;
}

3.定义处理器抽象类

public abstract class AbstractContextHandler implements ContextHandler {

    protected ContextHandler pre;
    protected ContextHandler next;

    @Override
    public void handle(GlobalContext param) {
        try {
            this.doHandler(param);
            if (next != null) {
                next.handle(param);
            }
        } catch (Exception e) {
            if (pre != null) {
                pre.rollback(param);
            }
        }
    }

    @Override
    public void rollback(GlobalContext param) {
        this.doRollback(param);
    }

    abstract void doHandler(GlobalContext param);
    abstract void doRollback(GlobalContext param);

    @Override
    public void setNext(ContextHandler handler) {
        this.next = handler;
    }

    @Override
    public void setPre(ContextHandler handler) {
        this.pre = handler;
    }

}

4.定义每个执行单元业务处理handler,(order从小到大执行)

@Component
@Order(2)
public class BuniessPayHandler extends AbstractContextHandler {

    @Override
    void doHandler(GlobalContext param) {
        System.out.println("BuniessPayHandler业务处理doHandler");
    }

    @Override
    void doRollback(GlobalContext param) {

    }
}

@Component
@Order(1)
public class BuniessProductHandler extends AbstractContextHandler {

    @Override
    void doHandler(GlobalContext param) {
        System.out.println("BuniessProductHandler业务处理doHandler");
    }

    @Override
    void doRollback(GlobalContext param) {

    }
}

5.定义责任链配置(项目启动时初始化执行顺序,以及调用执行入口)

@Component
public class Chain {

    @Resource
    private List<ContextHandler> handlerList;
    private ContextHandler header;

    @PostConstruct
    public void init() {
        if (CollectionUtils.isEmpty(handlerList)) {
            return;
        }
        ContextHandler pre = null;
        ListIterator<ContextHandler> iterator = handlerList.listIterator();
        while (iterator.hasNext()) {
            ContextHandler handler = iterator.next();
            if (header == null) {
                header = handler;
            }
            handler.setPre(pre);
            pre = handler;
            if (iterator.hasNext()) {
                handler.setNext(iterator.next());
                iterator.previous();
            }
        }
    }

    public void handler(GlobalContext param) {
        if (header == null) {
            return;
        }
        header.handle(param);
    }
}

6.单元测试

 @Autowired
    private Chain chain;

    @GetMapping("/test")
    public WebResponse<BrandRelationResult> test(GlobalContext param) {
        chain.handler(param);
        return null;
    }

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yeast_东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值