1. 设计模式之适配器模式:适配老版本接口和第三方接口
1.1. 介绍
适配器模式(Adapter Pattern)充当两个不兼容接口之间的桥梁,属于结构型设计模式。它通过一个中间件(适配器)将一个类的接口转换成客户期望的另一个接口,使原本不能一起工作的类能够协同工作。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
适配器模式是一种软件设计模式,旨在解决不同接口之间的兼容性问题。将一个类的接口转换为另一个接口,使得原本不兼容的类可以协同工作。
应用实例举例
- 电压适配器:将 110V 电压转换为 220V,以适配不同国家的电器标准。
- 接口转换:例如,将 Java JDK 1.1 的 Enumeration 接口转换为 1.2 的 Iterator 接口。
- 跨平台运行:在Linux上运行Windows程序。
- 数据库连接:Java 中的 JDBC 通过适配器模式与不同类型的数据库进行交互。
优缺点及建议
适配器模式可以清晰地表达其核心概念和应用,同时避免了不必要的复杂性。
优点
1.促进了类之间的协同工作,即使它们没有直接的关联。
2.提高了类的复用性。
3.增加了类的透明度。
4.提供了良好的灵活性。
缺点
1.过度使用适配器可能导致系统结构混乱,难以理解和维护。
2.在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。
使用建议
1.适配器模式应谨慎使用,特别是在详细设计阶段,它更多地用于解决现有系统的问题。
2.在考虑修改一个正常运行的系统接口时,适配器模式是一个合适的选择。
1.2. 实现及相关代码
假设有一个业务,有新接口和老接口,但是别人调用或者第三方调用,都是以新接口方式来调用,这时可以使用适配器模式将老接口做一层封装。
1.2.1. 没使用设计模式方式
接口及数据对象
/** 老版本接口 */
public interface OldInterface {
void oldExecute();
}
/** 老版本接口的实现类 */
public static class OldInterfaceImpl implements OldInterface {
public void oldExecute() {
System.out.println("老版本接口实现的功能逻辑");
}
}
/** 新版本接口 */
public interface NewInterface {
void newExecute();
}
/** 新版本接口的实现类 */
public static class NewInterfaceImpl implements NewInterface {
public void newExecute() {
System.out.println("新版本接口实现的功能逻辑");
}
}
调用方法
public static void main(String[] args) {
OldInterface oldObject = new OldInterfaceImpl();
NewInterface newObject = new NewInterfaceImpl();
oldObject.oldExecute();
newObject.newExecute();
}
可能会遇到的问题
其他业务或者第三方调用的时候,需要同时关心你新版本和老版本的接口,对于调用方不友好,耦合比较严重。
1.2.2. 使用设计模式方式
将老版本通过适配器方式封装,按新版本的方式来调用,这样对于调用方调用的方式就完全一致了,不需要关心老的接口结构,对外部方式统一,方便调用及维护。
接口及数据对象
/** 定义一个适配器类 */
public static class NewInterfaceAdapter implements NewInterface {
private OldInterface oldObject;
public NewInterfaceAdapter(OldInterface oldObject) {
this.oldObject = oldObject;
}
public void newExecute() {
oldObject.oldExecute();
}
}
/** 老版本接口 */
public interface OldInterface {
void oldExecute();
}
/** 老版本接口的实现类 */
public static class OldInterfaceImpl implements OldInterface {
public void oldExecute() {
System.out.println("老版本接口实现的功能逻辑");
}
}
/** 新版本接口 */
public interface NewInterface {
void newExecute();
}
/** 新版本接口的实现类 */
public static class NewInterfaceImpl implements NewInterface {
public void newExecute() {
System.out.println("新版本接口实现的功能逻辑");
}
}
调用方法
public static void main(String[] args) {
NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
NewInterface newObject = new NewInterfaceImpl();
oldObject.newExecute();
newObject.newExecute();
}