定义与类型
- 定义:将一个类的接口转换成客户期望的另一个接口
- 使原本接口不兼容的类可以一起工作
- 类型:结构型
适用场景
- 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
- 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不同情况下的解决方案
优点
- 能够提高类的透明性和复用,现有类复用但不需要改变
- 目标类和适配器类解耦,提高程序扩展性
- 符合开闭原则
缺点
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性
- 增加系统代码可读的难度
扩展
- 对象适配器
- 类适配器
相关设计模式
- 适配器模式和外观模式
代码演示
类适配器
- 创建被适配者
/**
* @author lijiayin
*/
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配者的方法");
}
}
- 创建需要适配的接口
/**
* @author lijiayin
*/
public interface Target {
void request();
}
- 创建适配器
/**
* @author lijiayin
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
- 测试一下
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
-
测试结果
测试结果.png -
UML图
UML.png
对象适配器
- 修改Adapter类
/**
* @author lijiayin
*/
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
-
测试一下
测试结果.png -
UML图
UML.png
将220V交流电转为5V直流电
- 创建AC220类
/**
* @author lijiayin
*/
public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("输出交流电" + output + "V");
return output;
}
}
- 创建需要实现的接口DC5
/**
* @author lijiayin
*/
public interface DC5 {
int outputDC5V();
}
- 创建适配器
/**
* @author lijiayin
*/
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
//变压器(适配逻辑)
int adapterOutput = adapterInput / 44;
System.out.println("使用PowerAdapter,将输入AC" + adapterInput + "V,转为输出DC" + adapterOutput + "V");
return adapterOutput;
}
}
- 测试一下
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
-
测试结果
测试结果.png
框架源码
- jdk中的XmlAdapter
- spring下的AdvisorAdapter
- jpa中的JpaVendorAdapter
网友评论