策略模式与模板方法模式的结合

/**
* 场景示例说明:删除提货单 和 删除任务单 存在共有的逻辑(可以定义在抽象父类的模板方法中),
* 后端rest分别提供删除提货单和删除任务单接口,在接口中根据操作标识选择 删除提货单 还是 删除任务单 的策略逻辑
*/

// 0. 定义操作策略接口
public interface OperateStrategy {
    String operateType();
    void operateHandle(TransTaskOperateRequestDto transTaskOperateRequestDto);
}
// 1. 定义抽象模板类
public abstract class AbstractOperateHandler{
    protected void operateHandle(TransTaskOperateRequestDto transTaskOperateRequestDto){
        handleValadation();
        doHandle();
        notifyExternal();
        saveOperateLog();
    }
    // 业务校验
    protected abstract boolean handleValadation();
    // 业务处理
    protected abstract void doHandle();
    // 通知平台
    protected abstract void notifyExternal();
     // 记录操作日志
    protected abstract void saveOperateLog();
}
// 3. 定义具体的策略实现类
/**
* 提货单删除策略
*/
@Component
public class LoadDeleteOperateStrategy extends AbstractOperateHandler implements OperateStrategy{
    @Override
    public String operateType() {
        return OperateEnum.LOAD_DELETE.getCode();
    }
    
    @Override
    public void operateHandle(TransTaskOperateRequestDto transTaskOperateRequestDto) {
        super.operateHandle(transTaskOperateRequestDto);
    }
    
    @Override
    public void handleValadation() { }
    
    @Override
    public void doHandle() { }
    
    @Override
    public void notifyExternal() { }
    
    @Override
    public void saveOperateLog() { }
}

/**
 * 任务单删除策略
 **/
@Component
public class MainlineDeleteOperateStrategy extends AbstractOperateHandler implements OperateStrategy{
     @Override
    public String operateType() {
        return OperateEnum.SHIP_DELETE.getCode();
    }
    
    ...
}
// 4. 调用方
@Component
public class TransTaskBusiness{
    private Map<String, OperateStrategy> operateStrategyMap = new ConcurrentHashMap<>();
    // 构造器注入 OperateStrategy 所有的实现类
    // Spring文档推荐使用构造器注入方式:
    /**
    * The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null.
    * Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.
    */
    @PostConstruct
    public void initStrategyMap() {
        operateStrategyList.forEach(strategy -> operateStrategyMap.put(strategy.operateType(), strategy));
    }
    
    // 提货单删除
    public boolean deletePickup(DeletePickupTasksDTO dto) {
        if (dto.getIds().size() != 1){
            throw new TransAppException("不支持批量删除,请进行单个删除");
        }
        // 1、参数转换
        TransTaskOperateRequestDto transTaskOperateRequestDto = new TransTaskOperateRequestDto();
        BeanUtils.copyProperties(dto, transTaskOperateRequestDto);
        // 2、业务逻辑处理
        operateStrategyMap.get(OperateEnum.LOAD_DELETE.getCode()).operateHandle(transTaskOperateRequestDto);
        return true;
   }
   
   // 任务单删除
   public boolean deleteMainline(DeleteMainlineTasksDTO dto) {
        if (dto.getIds().size() != 1){
            throw new TransAppException("不支持批量删除,请进行单个删除");
        }
        // 1、参数转换
        TransTaskOperateRequestDto transTaskOperateRequestDto = new TransTaskOperateRequestDto();
        BeanUtils.copyProperties(dto, transTaskOperateRequestDto);
        // 2、业务逻辑处理
        operateStrategyMap.get(OperateEnum.SHIP_DELETE.getCode()).operateHandle(transTaskOperateRequestDto);
        return true;
   }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值