引言
在我们日常项目开发中,我们有时候会遇到这种情况,同一数据源发出的数据格式却不同,可能大多数同学会有疑问,前端和服务器不都已经预先定义好数据格式和解析方式了吗,为啥还有数据格式不统一的情况出现呢?请听我慢慢道来...
背景
这段时间我在做一个车机项目的开发,其中就涉及到了与底层的交互,需要从CAN获取数据并解析(啥是CAN呢???这里引用百度知道的一句解释“CAN是控制器局域网络(Controller Area Network, CAN)的简称”)。
但是CAN这块的数据报文并不是固定的,它会根据不同车型不同配置会有相应的变化,为了完成这种复杂数据的解析我决定使用经典设计模式中的适配器模式来完成CAN数据解析的基础架构,其实当理解了适配器模式以后,这套解析的基础架构就非常好理解,而且也非常的简单了,复杂的是对CAN数据本身的解析(需要与底层对接确定每个字段及其意义)。
实现
1、首先我们需要些一个解析的接口,后续所有的解析类都需要实现该接口来进行解析
public interface IParser<I, O> {
O parser(int type, I input);
}
2、接着我们还需要定义一个复合解析接口,后续如果有新车型加入也是在此接口上进行增加
public interface IMulteParser<I, O> {
public O parserA(int type, I input);
public O parserB(int type, I input);
}
3、接下来我们需要分别实现对A、B车型的解析动作
public class ACarParserImpl implements IMulteParser<Dom, String> {
@Override
public String parserA(int type, Dom input) {
return "解析A车型";
}
@Override
public String parserB(int type, Dom input) {
return null;
}
}
public class BCarParserImpl implements IMulteParser<Dom, String> {
@Override
public String parserA(int type, Dom input) {
return null;
}
@Override
public String parserB(int type, Dom input) {
return "解析B车型";
}
}
4、接着我就来定义最关键的解析适配器
public class ParserAdapter implements IParser<Dom, String> {
IMulteParser<Dom, String> multeParser;
public ParserAdapter(int type) {
if (type == 1) {
multeParser = new ACarParserImpl();
} else if (type == 2) {
multeParser = new BCarParserImpl();
}
}
@Override
public String parser(int type, Dom input) {
if (type == 1) {
return multeParser.parserA(type, input);
} else if (type == 2) {
return multeParser.parserB(type, input);
}
return null;
}
}
其实该适配器中就是根据外部传入的类型来进行判断,创建不同的解析器来解析车辆CAN数据
5、接下来我们还要定义一个基础解析类来进行解析
public class Parser implements IParser<Dom, String> {
ParserAdapter adapter;
@Override
public String parser(int type, Dom input) {
if (type == 0) {
//TODO 解析基础车型数据
return "";
}
adapter = new ParserAdapter(type);
return adapter.parser(type, input);
}
}
在该基础解析类中,我们可以进行一些基础的解析,当解析有差异时我们可以使用解析适配器来解析数据,我们也可以直接使用适配器根据类型来解析数据。
最后是调用方法:
public static void main(String arg[]) {
Parser parser = new Parser();
String result = parser.parser(0, new Dom());
String result1 = parser.parser(1, new Dom());
String result2 = parser.parser(2, new Dom());
}
以上就是使用适配器来完成多类型数据解析的设计,该设计方式主要还是为了以后扩展方便,对项目本身逻辑代码侵入较少,程序整体逻辑清晰便于维护。
网友评论