先贴一下改造前的代码
/* 根据消息的不同类型有不同的逻辑 */
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));
}
}
}
经过修改后代码扩展性更强,且代码规整 如果新增加一个或多个类型,只需要将新的类型维护好就可以了。
注:由于将每个具体的算法都单独封装为一个类,如果可选类型有很多的话,那对象的数量也会很多。