今天分享一个经典的设计模式-责任链,这种模式非常适配物联网场景下平台对接设备。
1. 定义数据模型
public class MessageData {
private String deviceId;
/**
* 设备数据
*/
private DeviceData device;
/**
* 运行数据
*/
private DeviceRunData deviceRun;
/**
* 采集业务数据
*/
private List<DeviceCollectData> deviceCollectList;
/**
* 设备配置数据
*/
private List<DeviceConfigData> deviceConfigList;
}
通常我们拿到这样的一个数据模型,可能会直接写一个处理类依次处理每一个对象。但是如果我们使用责任链,那么整个结构会非常美观,拓展性极高。话不多说,直接上代码。
2. 定义抽象处理类
public abstract class AbstractHandler {
/**
* 下一个处理器
*/
protected AbstractHandler nextHandler;
public AbstractHandler(AbstractHandler handler) {
this.nextHandler = handler;
}
/**
* 处理数据
*
* @param messageData 数据模型
*/
public abstract void handle(MessageData messageData);
protected void goNextHandler(MessageData messageData) {
if (nextHandler != null) {
nextHandler.handle(messageData);
}
}
}
3. 简单实现两个处理类
public class DeviceInfoHandler extends AbstractHandler {
private final DeviceInfoService deviceInfoService;
public DeviceInfoHandler(AbstractHandler handler, DeviceInfoService deviceInfoService) {
super(handler);
this.deviceInfoService = deviceInfoService;
}
@Override
public void handle(MessageData messageData) {
DeviceData param = messageData.getDevice();
if (param == null) {
this.goNextHandler(messageData);
return;
}
// 以下为业务代码,设备基本信息入库~
this.goNextHandler(messageData);
}
}
public class DeviceRunInfoHandler extends AbstractHandler {
private final DeviceRunInfoService deviceRunInfoService;
public DeviceRunInfoHandler(AbstractHandler handler, DeviceRunInfoService deviceRunInfoService) {
super(handler);
this.deviceRunInfoService = deviceRunInfoService;
}
@Override
public void handle(MessageData messageData) {
DeviceRunData param = messageData.getDeviceRun();
if (param == null) {
this.goNextHandler(messageData);
return;
}
// 以下为实际业务代码,略过
this.goNextHandler(messageData);
}
}
4. 定义调度中心
@Component
public class DeviceHandlerCenter implements InitializingBean {
private final DeviceInfoService deviceInfoService;
private final DeviceRunInfoService deviceRunInfoService;
private DeviceInfoHandler deviceInfoHandler;
public DeviceHandlerCenter(DeviceInfoService deviceInfoService, DeviceRunInfoService deviceRunInfoService) {
this.deviceInfoService = deviceInfoService;
this.deviceRunInfoService = deviceRunInfoService;
}
/**
* 处理数据模型
*
* @param messageData 数据模型
*/
public void process(MessageData messageData) {
this.deviceInfoHandler.handle(messageData);
}
@Override
public void afterPropertiesSet() {
// 后续扩展直接在这里加就行
DeviceRunInfoHandler deviceRunInfoHandler = new DeviceRunInfoHandler(null, deviceInfoService, deviceRunInfoService);
deviceInfoHandler = new DeviceInfoHandler(deviceRunInfoHandler, deviceInfoService);
}
}
5. 最后在接收数据的地方直接调用调度中心的process方法就ok了。
6. 扩展性
这个结构可扩展性是非常高的,而且是链式的业务传递,这也就意味着各个处理链条中的参数传递可以放在MessageData这个模型中,我们可以直接在MessageData中定义一个Context对象,用来放置各种各样的参数,能有效的增强性能。
875

被折叠的 条评论
为什么被折叠?



