概述
适配器模式
定义:
将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
类型:
结构型。
适用场景:
已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案。
优点:
能提高类的透明性和复用,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序扩展性。
符合开闭原则。
缺点:
适配器编写过程需要全面考虑可能会增加系统的复杂性。
增加了系统代码可读的难度。
扩展
对象适配器:符合组合复用原则,使用委托机制
类适配器:通过类继承
适配器模式VS外观模式
都是对现有的类和系统的封装
外观定义了新的接口在现有系统中提供了方便的入口,适配器复用原有的接口,使两个已有的接口协同工作。外观的粒度更大。
代码:
//类适配器
//接口
public interface Target {
void request();
}
//接口实现类1
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("具体的Target");
}
}
//被适配者
public class Adaptee {
public void AdapteeRequest(){
System.out.println("被适配者的方法");
}
}
//适配器实现类
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
super.AdapteeRequest();
}
}
//测试类
public class Test {
public static void main(String[] args) {
Target target=new ConcreteTarget();
target.request();
Target adapterTarget=new Adapter();
adapterTarget.request();
}
}
//对象适配器,只有适配器实现类改变了,所以只把适配器实现类抛出来
public class Adapter implements Target {
//这里不一样,可以对比一下。
private Adaptee adaptee=new Adaptee();
@Override
public void request() {
adaptee.AdapteeRequest();
}
}
//220V交流电转5V直流电示例
public class AC220 {
public int outputAC220V(){
int output=220;
System.out.println("220交流电");
return output;
}
}
//适配器接口
public interface DC5 {
public int outputDC5();
}
//实现类
public class Adapter implements DC5 {
private AC220 ac220 = new AC220();
public int outputDC5() {
int adapterInput=ac220.outputAC220V();
//变压器
int adapterOutput = adapterInput/44;
System.out.println("转换为" + adapterOutput+"直流电");
return adapterOutput;
}
}
//测试类
public class Test {
public static void main(String[] args) {
DC5 dc5=new Adapter();
dc5.outputDC5();
}
}