策略模式+工厂方法分解ifelse

100 阅读1分钟

思路

1. 定义接口ResHandler

public interface ResHandler {  
    /**  
    *  
    */  
    void HandlerRes(String data, String deviceId);  

    /**  
    * 获取模式  
    * @return  
    */  
    String getModeType();  
    

2. 所有处理类实现ResHandler并实现相应的处理逻辑

@Component  
public class PushAddProgramParam implements ResHandler {  
  
    @Override  
    public void HandlerRes(String data, String deviceId) {  
    NettySocketUtil.sendNotice(data,ModeEnum.PUSH_ADD_PROGRAM_PARAM.getType());  
    }  
  
    @Override  
    public String getModeType() {  
    return ModeEnum.PUSH_ADD_PROGRAM_PARAM.getMode()+ModeEnum.PUSH_ADD_PROGRAM_PARAM.getType(); 
    }  
}

3. Spring中注入所有已实现ResHandler的处理服务

@Service  
public class HandlerResHolder {  
    /**  
    * 将 Spring 中所有实现 ServiceFee 的接口类注入到这个Map中  
    */  

    private final Map<String, ResHandler> orderStrategyMap = new ConcurrentHashMap<>();  

    public HandlerResHolder(Map<String, ResHandler> strategyMap) {  
    this.orderStrategyMap.clear();  
    strategyMap.forEach((k, v)-> this.orderStrategyMap.put(v.getModeType(), v));  
    }  
  
    private ResHandler getResHandler(String modeType) {  
        ResHandler resHandler = orderStrategyMap.get(modeType);  
        if (ObjectUtil.isNull(resHandler)) {  
        throw new IllegalArgumentException("传递数据参数不符合规范");  
        }  
        return resHandler;  
    }  
  
    public void getResult(String modeType, String data, String deviceId) {  
        getResHandler(modeType).HandlerRes(data, deviceId);  
    }  
}
  1. 需要处理的地方调用getResult
@Async  
public void handleReceiveData(String receiveData) {  
    log.info("数据处理后:"+receiveData);  
    JSONObject resJsonObject = JSONUtil.parseObj(receiveData);  
    // log.debug(resJsonObject.getStr("data"));  
    handlerResHolder.getResult(resJsonObject.getStr(SocketConst.KEY_MODE) + resJsonObject.getStr(SocketConst.KEY_TYPE), resJsonObject.getStr("data"),resJsonObject.getStr("deviceId"));  
}