adapter
场景介绍:
(1)假设我们做了一个第一版的一个系统,这个系统里有一个接口和实现类
(2)接着我们开始做的第二个版本,这个系统我们定义了一个新的接口,和新的实现类
(3)但是我们同时在第二个版本的系统中,也要使用第一版系统中定义的那个老接口和老实现类
不用设计模式的实现
package com.zhss.designpattern.adapter;
/**
* 不用设计模式的实现
*
*/
public class WithoutAdapterPatternDemo {
public static void main(String[] args) {
OldInterface oldObject = new OldInterfaceImpl();
NewInterface newObject = new NewInterfaceImpl();
oldObject.oldExecute();
newObject.newExecute();
}
/**
* 老版本的接口
*
*/
public static interface OldInterface{
void oldExecute();
}
/**
* 老版本接口的实现类
*
*/
public static class OldInterfaceImpl implements OldInterface{
public void oldExecute() {
System.out.println("老版本接口实现的功能逻辑");
}
}
/**
* 新版本的接口
*
*/
public static interface NewInterface{
void newExecute();
}
/**
* 新版本接口的实现类
*
*/
public static class NewInterfaceImpl implements NewInterface{
public void newExecute() {
System.out.println("新版本接口实现的功能逻辑");
}
}
}
如果不用任何设计模式,我们的问题在哪儿?
问题其实很明显,就是说,我们的新代码中,融合了新老两套接口,很麻烦的一个事情
首先如果你这么干的话,就会造成代码很复杂,面向的是规范和风格完全不同的两套接口,你理解和维护的成本提高了
其次,假如说,现在都不给你选择使用老版本接口的机会
直接强制性公司规范要求按照新版本接口走,你的老版本接口的实现类,就没法用了
难不成还要基于新版本的接口重新写一套。
适配器实现
package com.zhss.designpattern.adapter;
/**
* 适配器模式demo
*
*
*/
public class AdapterPatterDemo {
public static void main(String[] args) {
NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
NewInterface newObject = new NewInterfaceImpl();
oldObject.newExecute();
newObject.newExecute();
}
/**
* 定义一个适配器类
*
*
*/
public static class NewInterfaceAdapter implements NewInterface {
private OldInterface oldObject;
public NewInterfaceAdapter(OldInterface oldObject) {
this.oldObject = oldObject;
}
public void newExecute() {
oldObject.oldExecute();
}
}
/**
* 老版本的接口
*
* @author liyutao
*
*/
public static interface OldInterface {
void oldExecute();
}
/**
* 老版本接口的实现类
*
*
*/
public static class OldInterfaceImpl implements OldInterface {
public void oldExecute() {
System.out.println("老版本接口实现的功能逻辑");
}
}
/**
* 新版本的接口
*
*
*/
public static interface NewInterface {
void newExecute();
}
/**
* 新版本接口的实现类
*
*
*/
public static class NewInterfaceImpl implements NewInterface {
public void newExecute() {
System.out.println("新版本接口实现的功能逻辑");
}
}
}
在实际企业开发中的使用场景
这个模式一般是在系统不断升级的过程中使用,对已经写好的老的类,写一套适配器来适配老类,但是提供新的接口,这个我们在后面系统升级的时候,可以去实践。在项目阶段二的时候,会去实践的,真的有版本升级的时候,才可以完美的去演示这个模式的使用效果。
还有一种情况,是对于已有的第三方类库,比如redis的客户端,或者是elasticsearch的客户端,他们提供了一套API,但是我们这里的要求是需要面向我们这里的DAO接口来进行编程,此时可以写一个适配器,将比如redis客户端的接口适配到我们的接口,这个我们会在本次课程来实践。
比如我们的DAO接口,要求的接口风格都是:save、update、remove、list、get,这些方法风格
DAORedisImpl,redis客户端,get、set、mset、mget,一套接口;适配器,DAORedisImpl就是一个适配器,这个适配器实现的是我们的DAO接口,在我们的save、update、remove等方法中,去调用redis客户端的get、set、mset、mget等方法。