背景
书接上回:小实验·设计模式-简单工厂模式
上次立下的flag,这波来兑现了
重新捋一下场景:
我作为公共组件,对接的另外一个组件出现了版本变更,原来的接口已经不用了,需要使用新的接口代替;但需要同时兼容两个版本(版本切换有一个过程,需要逐渐过渡,所以存在一段时间不同的局点使用的组件版本或高或低)
上一次我介绍了如何在新接口和老接口的入参和返回参数都相同的情况下进行适配;
这一次,介绍一下如何在入参和返回参数不同的情况下进行适配;
(其实硬要兼容,强行写各种代码也能,只不过嘛,为了后期好维护,以及作为一个程序员的矜持,代码上稍微设计一下更爽,当然,好维护才是重点)
代码
假设,版本4的方法getName()入参是“String id”,而版本5的getName()入参是“String idJson”,就是版本4原来只要传递一个字符串就可以了,但是版本5这里需要的是json格式的字符串;
两个Service的差异
如下,serviceA中需要一个单纯的字符串而已
public class ServiceA implements IService {
@Override
public String getName( String id) {
return "I am ServiceA,param is :"+ id;
}
}
serviceB需要的是一个json格式的字符串
public class ServiceB implements IService {
@Override
public String getName(String jsonId) {
return "I am ServiceB, param is :"+jsonId;
}
}
适配器
public class Adaptor implements IService {
ServiceB serviceB = new ServiceB();
@Override
public String getName(String param) {
System.out.println("入参经过适配器翻译...");
String jsonId = "{\"id\":\""+param+"\"}";
serviceB.getName(jsonId);
String result = serviceB.getName(jsonId);
//如果返回的结果需要重新进行格式化处理,也可以在这一步进行
result = formatResult(result);
return result;
}
/**
* 对结果进行格式化处理
*/
private String formatResult(String result) {
//do something
System.out.println("对结果进行格式化处理");
return result;
}
}
可以看到,适配器中,就是对入参和出参进行了格式化,以满足新的接口的使用条件
工厂类调整
工厂类中对返回的serviceB实例进行调整,原来直接返回的一个serviceB对象,现在返回一个适配器
public class Factory {
public static IService getService(boolean isServiceA)
{
if (isServiceA)
{
return new ServiceA();
}
return new Adaptor();
}
}