设计模式-策略模式

先贴一下改造前的代码

/* 根据消息的不同类型有不同的逻辑 */
if(zcInternalPushVO.getMessageTopic().equals(TopicEnum.INTERNAL_SUPPERLIER_MODIFY.getCode())){
    //TODO 1
}
if(zcInternalPushVO.getMessageTopic().equals(TopicEnum.SUPPERLIER_IMPORT.getCode())){
    //TODO 2
}
if(zcInternalPushVO.getMessageTopic().equals(TopicEnum.SUPPERLIER_MODIFY.getCode())){
    //TODO 3
}

原有代码处理这种做了大量的if 语句,这样一旦类型多了起来会导致特别混乱

改造后

MessageContext.getStrategy(zcInternalPushVO.getMessageTopic()).dealMessage(zcInternalPushVO);

相关类

1.简单工厂

/**  
* @Title: 根据不同type获取不同策略
* @Description:
* @Author: Bo2
* @Date: 2023/8/17 8:44
*/
public class MessageContext {
    private static final Map<String, MessageStrategyInterface> strategies = new HashMap<>();

    static {
        strategies.put(TopicEnum.SUPPERLIER_IMPORT.getCode(), BudgetSyncApplication.context.getBean(SupplierNkStrategy.class)); // 供应商推内控
        strategies.put(TopicEnum.INTERNAL_SUPPERLIER_MODIFY.getCode(), BudgetSyncApplication.context.getBean(SupplierGpimpStrategy.class)); //供应商推gpimp

        strategies.put(TopicEnum.INTERNAL_EMPERT_MODIFY.getCode(), BudgetSyncApplication.context.getBean(ExpertStrategy.class)); //专家变更推gpimp

        strategies.put(TopicEnum.AGENT_IMPORT.getCode(), BudgetSyncApplication.context.getBean(AgentNkStrategy.class)); // 代理机构推内控
        strategies.put(TopicEnum.INTERNAL_AGENT_MODIFY.getCode(), BudgetSyncApplication.context.getBean(AgentGpimpStrategy.class)); //代理机构推gpimp

    }

    public static MessageStrategyInterface getStrategy(String type) {
        if (type == null || type.isEmpty()) {
            throw new IllegalArgumentException("type should not be empty.");
        }
        if(strategies.get(type)==null){
            throw new IllegalArgumentException("type class is not found.");
        }
        return strategies.get(type);
    }

}

2.策略接口

/**
* @Title: 策略接口
* @Description:
* @Author: Bo2
* @Date: 2023/8/17 8:44
*/
public interface MessageStrategyInterface {

     void dealMessage(ZCInternalPushVO zcInternalPushVO);


     /**
     * @Title: setMessageLog
     * @Description: 保存日志
     * @Author: 沈博
     * @Date: 2023/8/18 16:09
     */
     default MessageLog setMessageLog(MessageLog messageLog,ZCInternalPushVO zcInternalPushVO){
         MessageLog m = new MessageLog();
         m.setId(SequenceUtil.getGUID());//日志记录id
         m.setExceptionInfo(messageLog.getExceptionInfo());
         m.setSyncState(messageLog.getSyncState());//同步状态(0:同步失败;1:同步成功)
         m.setCreateDate(DateTimeUtil.getDateTime());
         m.setUpdateDate(DateTimeUtil.getDateTime());
         m.setSyncDate(DateTimeUtil.getDateTime());
         m.setBusinessId(zcInternalPushVO.getBusiKey());//业务id
         m.setMessageContent(zcInternalPushVO.getMessageContent());
         m.setMessageTopic(zcInternalPushVO.getMessageTopic());
         m.setDataSource("lnzc");
         return m;
     };


}

3.策略子类

/**
* @Title: 供应商推送gpimp策略子类
* @Description:
* @Author: Bo2
* @Date: 2023/8/17 8:44
*/
@Slf4j
@Component
public class SupplierGpimpStrategy implements MessageStrategyInterface {

    @Autowired
    private GpimplnOpenClient gpimplnOpenClient;

    @Autowired
    private MessageLogRepository messageLogRepository;

    private MessageLog messageLog;


    @Override
    public void dealMessage(ZCInternalPushVO zcInternalPushVO){
        messageLog = new MessageLog().setSyncState("1");
        try{
            Map<String,Object> suppliersVO = JSONObject.parseObject(zcInternalPushVO.getMessageContent(), Map.class);
            ResponseBean<String> responseBean = gpimplnOpenClient.suppliersaudit(suppliersVO);
            if(responseBean.getCode()!=200){
                throw new BusiException(HttpStatus.BAD_REQUEST,responseBean.getMsg());
            }
        }catch(Exception e){
            messageLog.setExceptionInfo(e.getMessage());
            messageLog.setSyncState("0");//同步状态(0:同步失败;1:同步成功)
            e.printStackTrace();
        }finally {
            messageLogRepository.save(setMessageLog(messageLog,zcInternalPushVO));
        }
    }

}

经过修改后代码扩展性更强,且代码规整 如果新增加一个或多个类型,只需要将新的类型维护好就可以了。

注:由于将每个具体的算法都单独封装为一个类,如果可选类型有很多的话,那对象的数量也会很多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值