雏形代码结构
主要涉及到命令的分发,解析,数据报文的解析
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);
}