一,定义与类型
将一个类的接口转换成客户期望的另一个接口
使原本不兼容的类可以一起工作
类型:结构型
二,适用场景
1.已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
2.不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
三,优点:
1能提高类的透明性和复用,现有的类复用但不需要改变
2.目标类和适配器类解耦,提高程序扩展性
3.符合开闭原则
四,缺点:
1.适配器编写过程中需要全面考虑,可能增加系统的复杂性
2.增加系统代码可读的难度
五,代码演练:
类适配器
1.adaptee
public class adaptee {
public void adapteeRequest(){
System.out.println("被适配的方法");
}
}
2.Target
public interface Target {
void request();
}
3.ConcreteTarget
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
4.Adapter
public class Adapter extends adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
5.Test
public class Test {
public static void main(String[] args) {
Target target=new ConcreteTarget();
target.request();
Target contarget= new Adapter();
contarget.request();
}
}
UML图
类适配器
只修改Adapter类
public class Adapter implements Target {
private adaptee adaptee=new adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
模拟场景:220V的交流电转换为5V的直流电
1,AC220V
public class AC220V {
public int outputAC220V(){
int output=220;
System.out.println("输出"+output+"V的交流电");
return output;
}
}
2,DC5V
public interface DC5V {
int output();
}
3,PowerAdapter
public class PowerAdapter implements DC5V {
private AC220V ac220V=new AC220V();
@Override
public int output() {
int adapterInput=ac220V.outputAC220V();
int adapterOutput=adapterInput/44;
System.out.println("使用PowerAdapter输入AC:"+adapterInput+"V 输出直流电:"+adapterOutput+"V");
return adapterOutput;
}
}
4,Test
public class Test {
public static void main(String[] args) {
DC5V dc5V=new PowerAdapter();
dc5V.output();
}
}
六,源码:
XMLAdapter:XML序列化反序列化
Spring:MethodBeforeAdviceAdapter,JpaVendorAdapter
SpringMVC:HandlerAdapter