责任链模式+建造者模式让你业务“香”起来

今天之所以再拿起来讲讲,是因为这里面涉及到的知识点,其实挺多的,可能设计模式都会有一个通病:

那就是如何将业务bean统一交给Spring管理,否则无法引用。接下来给大家举个例子。今天我想搞一个讨论会,大家尝试解决 并在评论区我们讨论下,谁的方案更好。 我也学习下,因为我的方案不是最好的。所以先不粘贴出来。希望大家理解

抛出问题

比如我们一个下单业务(怎么简单怎么来):

第一步:接口参数校验

第二步:创建支付订单

第三步,请求支付服务获取支付信息

最终方案是要用责任链的模式处理这几个业务块,这样达到解藕目的,新的业务请求再进来,只需要加类就行,比如到时候要来个减库存操作。直接加类即可。不影响参数校验模块,创建订单模块,只需要按照相应顺序链式调用即可,一传二,二传三,最终执行完成

好,责任链的东西 就说这么多(点击我头像专栏可以详细看设计模式),本节重点是如何解决bean加载问题。

下面Hanler类是责任链处理类,OrderPayCheckHandler 是参数校验类。OrderPayResultHandler是业务处理完毕类

image.png

代码案例:


/**
 * 定义责任链处理类
 * @Date 2021/4/14 7:26 下午
 * @Author yn
 */
@Component
public abstract class Handler<T> {

    protected Handler next;


    public void next(Handler next){
        this.next = next;
    }


    public abstract ResponseBO doHandler(OrderPayDto orderPayDto, NextProcessParam nextParam);


    public static class Bulider<T>{

        private Handler<T> head; //责任链头部

        private Handler<T> tail; //责任链尾


        public Bulider<T> addHandler(Handler handler){

            if (this.head == null){
                this.head = this.tail = handler;

                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
            return this;
        }

        public Handler<T> build(){return this.head;}
    }
}

上面这段代码很好理解,那就是处理这个链式调用的。下面是开始校验模块

/**
 * 校验业务处理类
 * @Date 2021/10/18 6:29 下午
 * @Author yn
 */
@Service
public class OrderPayCheckHandler extends Handler{


    private Logger logger = LoggerFactory.getLogger(OrderPayCheckHandler.class);



    //orderPayService 能拿到吗?
    @Autowired
    private OrderPayService orderPayService;


    @Override
    public ResponseBO doHandler(OrderPayDto orderPayDto, NextProcessParam nextParam) {
        int platformCardValue = 0 ,carOrderNeedPay = 0,couponValue = 0,couponOrderNeedValue = 0;

        //返回数据体
        JSONObject resJson = new JSONObject();
        resJson.put("needPay",true);//默认需要支付


        //这里会不会报空指针异常
        OrderRecord thsOrderRecord = orderPayService.getByOrderNo(orderPayDto.getOrderNo());
        
        if (thsOrderRecord == null){
            resJson.put("needPay",false);
            resJson.put("orderNo",thsOrderRecord.getOrderNo());
            resJson.put("msg","订单不存在!");
            return ResponseBO.Builder.init().setData(resJson).build();
        }
        //订单状态
        if(OrderRecord.getOrderStatus() == 1){//支付已完成
            resJson.put("needPay",false);
            resJson.put("orderNo",orderRecord.getOrderNo());
            return ResponseBO.Builder.init().setData(resJson).build();
        }

        //getpaycode
        String payCode = "pay_code";


        //贯穿整个业务记录的bizcode
        String bizCode= StringUtil.randomOrderNo("CM");//业务订单标示

        //组装下个链式所需参数
        NextProcessParam nextProcessParam = NextProcessParamBuilder.build().ofOrderPay(payCode,bizCode);

        //往下个调用传参
        return next.doHandler(orderPayDto,nextProcessParam);
    }
}

模拟调用:


/**
 * 统一支付
 * @param orderPayDto
 * @return
 */
@RequestMapping(value = "testApi",method = RequestMethod.POST, produces = "application/json")
public ResponseBO testApi(@RequestBody OrderPayDto orderPayDto){
    Handler.Bulider bulider = new Handler.Bulider();
    Handler handler = bulider.addHandler(new OrderPayCheckHandler()).addHandler(new OrderPayResultHandler()).build();
    return handler.doHandler(orderPayDto,new NextProcessParam());
}

问题点:

OrderPayCheckHandler类中无法引入OrderPayService,报空指针

这就是今天要说的 ,那就是abstract 处理流程中 无法注入bean,大家有没有好的解决方案。在你们的实战中是怎么解决的?欢迎大家评论区交流。我第二天会把我的方案给放出来。

作者:苏世_
链接:https://juejin.cn/post/7020434286188691463
来源:稀土掘金

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值