【Java开发】命令解析框架CommandX

雏形代码结构

主要涉及到命令的分发,解析,数据报文的解析

public abstract class BaseProcessor<T> implements CommandHandler {

    protected final Dispatcher dispatcher;

    protected String command = "";

    protected T commandData;

    public BaseProcessor(Dispatcher dispatcher) {
        this.dispatcher = dispatcher;
    }

    @Override
    public void handle(String command) {
        this.command = command;

        T data = parseCommand(command);
        if (data != null) {
            commandData = data;
        }

        responseCommand();

        executeCommand();
    }

    @NonNull
    public abstract String targetCommand();

    public abstract T parseCommand(String command);

    public abstract void responseCommand();

    public abstract void executeCommand();

}

分发器

public class Dispatcher {

    private final Map<String, BaseProcessor<?>> processorMap = new HashMap<>(8);

    private final PriorityBlockingQueue<String> commandQueue = new PriorityBlockingQueue<>(8);
    private final Runnable workTask = () -> {
        while (true) {
            // Traverse the command queue.
            String command = commandQueue.remove();
            if (command != null) {
                dispatch(command);
            }
        }
    };
    private Thread workThread;

    public Dispatcher() {
        initProcessorMap();

        loopWork();
    }

    private void initProcessorMap() {
        TestCommandProcessor testCommandProcessor = new TestCommandProcessor(this);
        GetPropertyCommandProcessor getPropertyCommandProcessor = new GetPropertyCommandProcessor(this);

        processorMap.put(testCommandProcessor.targetCommand(), testCommandProcessor);
        processorMap.put(getPropertyCommandProcessor.targetCommand(), getPropertyCommandProcessor);
    }

    @Nullable
    public BaseProcessor<?> getProcessor(@NonNull String command) {
        Set<Map.Entry<String, BaseProcessor<?>>> entrySet = processorMap.entrySet();
        for (Map.Entry<String, BaseProcessor<?>> entry : entrySet) {
            //
            if (command.startsWith(entry.getKey())) {
                return entry.getValue();
            }
        }

        return null;
    }

    public void addCommand(String command) {
        commandQueue.add(command);
    }

    public void stop() {
        if (workThread.isAlive() || !workThread.isInterrupted()) {
            workThread.interrupt();
        }
    }

    private void dispatch(String command) {
        // put command to dispatch queue.
        BaseProcessor<?> processor = getProcessor(command);

        if (processor == null) {
            return;
        }

        processor.handle(command);
    }

    private void loopWork() {
        workThread = new Thread(workTask, "DispatchThread");
        workThread.start();
    }
}

具体某个CommandProcessor

public class GetPropertyCommandProcessor extends BaseProcessor<GetPropertyCommandProcessor.GetPropertyCommandData> {

    public GetPropertyCommandProcessor(Dispatcher dispatcher) {
        super(dispatcher);
    }

    @NonNull
    @Override
    public String targetCommand() {
        return "GET_PROPERTY=";
    }

    @Override
    public GetPropertyCommandData parseCommand(String command) {
        // GET_PROPERTY=ABC,DEF\n
        String sub = command.substring(targetCommand().length(), command.indexOf('\n'));

        // Parse sub string.
        String[] data = sub.split(",");
        return new GetPropertyCommandData(data);
    }

    @Override
    public void responseCommand() {
        //

    }

    @Override
    public void executeCommand() {
        String response = String.format(Locale.US, "POST_PROPERTY=%s,%s,%d\n",
            commandData.firstValue, commandData.secondValue, 88);
        Log.d("Test", response);
    }

    public static class GetPropertyCommandData {

        public final String firstValue;
        public final String secondValue;

        public GetPropertyCommandData(String[] data) {
            firstValue = data[0];
            secondValue = data[1];
        }

    }
}

接口

public interface CommandHandler {

    void handle(String command);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值