背景
场景是这样的,客户端要发送JSON数据到达服务端解析,由于客户端的不同版本更新,打过来的数据有差异,服务端要兼容这种差异对不同的处理这些数据,因为客户端升级是由用户决定的。
思路
实现的方式肯定很多种,恰好学到《effective java》中的枚举,枚举可以加一个方法,我们这个场景每一种日志格式就对应于一种解析的方法。
public enum LogVersion {
OLD(0),NEW(1){
@Override
public String parseLog(JSONObject jsonObject) {
return jsonObject.toString() + "new";
}
};
private final int num;
private LogVersion(int num) {
this.num = num;
}
public String parseLog(JSONObject jsonObject) {
return jsonObject.toString();
}
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
String oldVersionLog = OLD.parseLog(jsonObject);
String newVersionLog = NEW.parseLog(jsonObject);
System.out.println(oldVersionLog);
System.out.printf(newVersionLog);
}
}
当然,项目中实现的逻辑比这个复杂得多。但是,这样做就好吗?极致的代码都在追求:扩展性、复用性、性能。如果客户端再发一个版本,我们在里面重写解析方法就好;当很多不同类型的客户端觉得这个处理逻辑很相似,需要复用这个LogVersion
的处理,这样就会带来问题,首先是命名我们命得不好,