在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
主要解决了:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
项目中总结:
下单过程中,下单中间步骤相同,但是中间有些过程和具体的支付方式相关,原本需要if....else 来判断,现在可以策略模式来决定运行时应该用哪个策略(子类)来实现。
真实调用:
根据OrderBizFactory.getOrderBiz 去找到真正需要那种方式去支付
@Override
@ValidationInputParameter
@WalletAopLog("WT:下单支付")
public CreateOrderResDTO createOrder(CreateOrderRequestDTO createOrderRequestDTO) {
MtLoggerFactory.TAG_LOCAL.set("WT:下单支付:" + createOrderRequestDTO.getUniqueOrderNo());
try {
LOGGER.info("下单支付 入参 CreateOrderRequestDTO:{}",createOrderRequestDTO);
CreateOrderResDTO createOrderResDTO = OrderBizFactory.getOrderBiz(createOrderRequestDTO.getSourceType()).createOrder(createOrderRequestDTO);
LOGGER.info("下单支付 出参 CreateOrderResDTO:{}",createOrderResDTO);
return createOrderResDTO;
}finally {
MtLoggerFactory.TAG_LOCAL.set(null);
}
}
OrderBizFacatory
public class OrderBizFactory {
static Map<String,AbstractOrderBiz> orderBizMap = new HashMap<>();
public static void addOrderBiz(String sourceType,AbstractOrderBiz abstractOrderBiz){
orderBizMap.put(sourceType,abstractOrderBiz);
}
public static AbstractOrderBiz getOrderBiz(String sourceType){
return orderBizMap.get(sourceType);
}
}
抽象类:
/**
* 创建订单
*
* @param createOrderRequestDTO
* @return
*/
public CreateOrderResDTO createOrder(CreateOrderRequestDTO createOrderRequestDTO){
//0.入参校验
checkParam(createOrderRequestDTO);
//1. 校验支付密码正确性
checkPayPwd(createOrderRequestDTO);
//2.验证验密bizNo&token正确性
if(StringUtils.isNotBlank(createOrderRequestDTO.getBizNo())&&StringUtils.isNotBlank(createOrderRequestDTO.getToken())){
checkBizAndToken(createOrderRequestDTO);
}
//3.根据来源创建具体订单
return createConcreteOrder(createOrderRequestDTO);
}
子类一、
public class AOrderBizImpl extends AbstractOrderBiz implements Serializable {
public AOrderBizImpl(){
super("A");
}
CreateOrderResDTO createConcreteOrder(CreateOrderRequestDTO createOrderRequestDTO) {
//具体创建订单
OrderEntity orderEntity = doSomething(createOrderRequestDTO);
return assembleCreateOrderResDTO(orderEntity);
}
}
子类二、
public class BOrderBizImpl extends AbstractOrderBiz implements Serializable {
public BOrderBizImpl(){
super("A");
}
CreateOrderResDTO createConcreteOrder(CreateOrderRequestDTO createOrderRequestDTO) {
//具体创建订单
OrderEntity orderEntity = doSomething(createOrderRequestDTO);
return assembleCreateOrderResDTO(orderEntity);
}
}