JAVA设计模式之策略模式---支付

注:这里的支付并不是支付方式(微信,支付宝)而是根据业务来的不同支付节点,比如定金(预付款)运费,尾款根据不同的支付节点处理不同的业务逻辑。

在本文末尾会比较策略模式与工厂模式和装饰者模式的区别

策略模式UMl类图:

 下图就是Context上下文通过对WaybillDO封装不同的属性进行传参,拼接字符串。

 private WaybillPayResultVO payRpc(WaybillDO waybill, WaybillSettleCompute waybillSettleCompute) {
        
        WaybillPayResultVO payResult = SpringUtil.getBean("waybillPayFund_"             
                                       + waybill.getPay.getCode()
                                       + "_" + waybill.getPayType().getValue() 
                                       + "_new", WaybillFundPayNewService.class).createTrans(waybill, waybillSettleCompute);
        return payResult;

    }

字符串拼接结果:(下边重点讲一下)

@Service("waybillPayFund_18_0_new")
@Service("waybillPayFund_18_1_new")
@Component("waybillPayFund_4_2_new")
......

 下面这个接口就相当于类图中Strategy(策略类),支持所有的公共接口。

public interface WaybillFundPayNewService {

    /**
     * 创建交易订单
     * @param waybill
     * @param waybillSettleCompute
     */
    WaybillPayResultVO createTrans(WaybillDO waybill, WaybillSettleCompute waybillSettleCompute);

    /**
     * 调平
     * @param waybillPayRecordPayable
     * @return
     */
    WaybillPayResultVO createTrans(WaybillPayRecordPayableDO waybillPayRecordPayable);

    /**
     * 回调
     */
    void callBack(WaybillPayCallBackDTO waybillPayCallBack);
}

 具体策略类:

@Service("waybillPayFund_18_1_new")
@Slf4j
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class CreditRefundZYToCustomerImpl implements WaybillFundPayNewService {


    @Override
    public WaybillPayResultVO createTrans(WaybillDO waybill, WaybillSettleCompute waybillSettleCompute) {
    //具体策略的实现逻辑
    }
    @Override
    public WaybillPayResultVO createTrans(WaybillPayRecordPayableDO waybillPayRecordPayable) {
    //具体策略的实现逻辑
    }

    @Override
    public void callBack(WaybillPayCallBackDTO waybillPayCallBack) {
    //具体策略的实现逻辑
    }
}

 有人会问那它是怎么通过策略类来选择具体的那个策略呢?

没错!就是通过拼接的字符串!

这个字符串会动态构建出一个与 @Service 注解中的标识符 "waybillPayFund_18_1_new" 相匹配的字符串,然后通过 SpringUtil.getBean(...) 方法来获取与该标识符匹配的 Spring Bean 实例。这个实例的类型是 WaybillFundPayNewService.class

因此,这种方式是基于注解 @Service 中的标识符来获取相应的 Spring Bean 实例,使得你可以动态选择并获取不同的服务组件实例,而不需要显式地创建对象。这符合了 Spring 框架的依赖注入和 IoC(控制反转)的设计原则。

=====================那么策略模式的大体结构就是这样======================

我们聊聊 策略模式 工厂模式  装饰者模式的区别!

策略模式与工厂模式的区别:

  • 用途不一样

工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;

  • 关注点不一样

工厂更多关注对象创建
策略更多关注行为的封装

策略模式与装饰者模式的区别:

策略模式更倾向是N选1的模式,也即根据条件选择相应的策略,但各种策略是互斥的,装饰者模式是在主体逻辑的基础上的附加逻辑,另外,策略模式是不需要与组件有相同的接口的,装饰者模式需要装饰器与组件有相同的接口  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值