注:这里的支付并不是支付方式(微信,支付宝)而是根据业务来的不同支付节点,比如定金(预付款)运费,尾款根据不同的支付节点处理不同的业务逻辑。
在本文末尾会比较策略模式与工厂模式和装饰者模式的区别
策略模式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的模式,也即根据条件选择相应的策略,但各种策略是互斥的,装饰者模式是在主体逻辑的基础上的附加逻辑,另外,策略模式是不需要与组件有相同的接口的,装饰者模式需要装饰器与组件有相同的接口