首页 > 编程语言 >java-策略模式的简单应用

java-策略模式的简单应用

时间:2023-03-23 15:23:39浏览次数:38  
标签:info java String 策略 模式 heartBeatVo operator public MqttCallBackService

我以我在实际项目中的应用举例

场景如下:MQTT收到消息之后,根据不同的标识(operator)去进行不同的处理

1.新建接口MqttCallBackService<T> 

public interface  MqttCallBackService<T> {
   //形参的转换方法
T parseMessageToFunctionParam(JSONObject messageInfo);
  //统一的处理方法
void dealMqttMessageData(T jsonMessage);
  //获取操作标识 作为后续策略key使用,这里因为场景需要才定义的,也可不定义
String getOperator();

}
2.所有的实现了均应实现MqttCallBackService<T>接口
@Service //心跳处理实现
public class HeartBeatCallBackServiceImpl implements MqttCallBackService<HeartBeatVo> {

@Autowired
private DeviceManagerService deviceManagerService;

@Override
public HeartBeatVo parseMessageToFunctionParam(JSONObject messageInfo) {
return JSONUtil.toBean(messageInfo, HeartBeatVo.class);
}

@Override
@Transactional
public void dealMqttMessageData(HeartBeatVo heartBeatVo) {
DeviceManagerSaveBo deviceManager = new DeviceManagerSaveBo();
deviceManager.setDeviceId(heartBeatVo.getFacesluiceId());
deviceManager.setHeartbeatTime(DateUtil.stringHHmmss2Date(heartBeatVo.getTime()));
this.deviceManagerService.updateHeartByDeviceId(deviceManager);
}

@Override
public String getOperator() {
return "HeartBeat";
}
}
@Service
@Slf4j //下线处理实现
public class OfflineCallBackServiceImpl implements MqttCallBackService<HeartBeatVo> {
@Override
public HeartBeatVo parseMessageToFunctionParam(JSONObject messageInfo) {
return JSONUtil.toBean(messageInfo, HeartBeatVo.class);
}

@Override
public void dealMqttMessageData(HeartBeatVo heartBeatVo) {
log.info("处理下线开始");
log.info("设备id为:" + heartBeatVo.getFacesluiceId()+" 下线;下线时间为:"+heartBeatVo.getTime());
log.info("处理下线结束");
}

@Override
public String getOperator() {
return "Offline";
}
}
3新建策略管理StrategyFactoryHandler
在此配置策略map
@Component
@Slf4j
public class StrategyFactoryHandler {

private final Map<String, MqttCallBackService> strategyMaps = new ConcurrentHashMap<>();

@Autowired //通过@Autowired 注解 可以自动获取到MqttCallBackService的所有实现并成为集合 按我设定的操作对应具体实现类型
    public StrategyFactoryHandler(List<MqttCallBackService> mqttCallBackServices) {
mqttCallBackServices.forEach(e -> {
strategyMaps.put(e.getOperator(), e);
});

log.debug("strategyMaps初始化:{}", strategyMaps);
}
  //根据操作获取具体的实现
public MqttCallBackService getService(String operate) {
return strategyMaps.get(operate);
}

}

4 调用:注入
@Autowired
private StrategyFactoryHandler strategyFactoryHandler;

获取返回消息中的operator ,根据operator 获取实现 ,再调用具体的处理方式进行处理
//String operator = commonVo.getOperator();

String operator = “Offline”;//HeartBeat
MqttCallBackService invokeHandler = strategyFactoryHandler.getService(operator);

JSONObject info = commonVo.getInfo();
//此方法是进行参数的转换
//invokeHandler.parseMessageToFunctionParam(info)
此处调用就会根据具体返回的实现类进行各自的参数处理
invokeHandler.dealMqttMessageData(invokeHandler.parseMessageToFunctionParam(info));

-----------END
No matter it is sunny or rainy ,your mood can never be cloudy


 




标签:info,java,String,策略,模式,heartBeatVo,operator,public,MqttCallBackService
From: https://www.cnblogs.com/7426QS/p/17247577.html

相关文章