适配器:字面理解就是对于原有的两个物品不匹配或者不能共用,通过第三方去连接,最终能达到一起作用的效果;
例如:家用的两孔插头,和三口插头的电器,在没有第三方的时候,两个物品之间根本不能结合,需要个转换器,三角插头才能够使用。
在软件开发中,项目初期写了一个接口,里面有几个方法,这个接口已经被别的类实现,运行在项目中了,项目后期有新的需求了,需要一个新的方法,但是需要兼容老接口的方法,那么问题来了,是在老接口里面添加方法还是重新开启一个接口呢? 在一般情况下,都不会去修改一个已经运行在线上的系统,那么目前的形势就只能新加一个接口;
那么这两个接口怎么结合起来呢?
老的接口以及实现类:
public interface LogFileOperateApi { public List<LogModel> readLog() throws IOException; public void writeLog(List<LogModel> list) throws FileNotFoundException, Exception; }
public class LogFileOperateImpl implements LogFileOperateApi { private String logFileNamePath = "AdapterLog.log"; public LogFileOperateImpl(String logFileNamePath) { this.logFileNamePath = logFileNamePath; } @Override public void writeLog(List<LogModel> list) throws FileNotFoundException, Exception {} @Override public List<LogModel> readLog() throws IOException {}
新的接口,需要适配或者同是使用老的接口:
public interface LogDBOperateApi { void update(LogModel logModel); void delete(LogModel logModel); }
那么就可以使用适配器模式去实现:
public class Adapter implements LogDBOperateApi { LogFileOperateApi logFileOperateApi; public Adapter(LogFileOperateApi logFileOperateApi) { this.logFileOperateApi = logFileOperateApi; } @Override public void update(LogModel logModel) { } @Override public void delete(LogModel logModel) { } }
客户端测试类:
public class AdpterTest { public static void main(String[] args) { LogFileOperateApi logFileOperateApi = new LogFileOperateImpl(""); LogDBOperateApi logDBOperateApi = new Adapter(logFileOperateApi); try { logDBOperateApi.readLog(); logDBOperateApi.update(); } catch (IOException e) { e.printStackTrace(); } } }
有个问题:如果LogFileOperateApi 被多个类继承,并且使用在spring中,这个适配器模式该怎么用呢?