一种模型搞定物联网设备接入-Java责任链模式

今天分享一个经典的设计模式-责任链,这种模式非常适配物联网场景下平台对接设备。

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对象,用来放置各种各样的参数,能有效的增强性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值