适配器模式(Adapter Pattern)
定义
它的功能是将一个类的接口变成客户端锁期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作。
属于结构型设计模式。
适用场景
已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
适配器模式不是软件设计阶段考虑的设计模式。它是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。类似于后期的补丁方案。
适配器主要是为了解决兼容问题。
类适配器用的是继承;对象适配器用的是组合。
标准示例
一 类适配器
类适配器,有三个角色:
目标接口(Target
)、适配者(Adapter)、类适配器(ClassAdapter
)
具体代码如下:
public interface Target{void request();
}
public class Adapter{public void specificRequest(){System.out.println("适配器中的业务代码");}
}
public class ClassAdapter extends Adapter implements Target{public void request(){super.specificRequest();}
}
public class ClientTest{public static void main(String[] args){Target target = new ClassAdapter();target.request();}
}
执行结果输出为:
适配器中的业务代码
二 对象适配器
对象适配器,也有三个角色:
目标接口(Target
)、适配者(Adapter)、类适配器(ObjectAdapter
)
前两者与类适配器中相同。
实际上,类适配器与对象适配器的区别,主要在于:
前者是通过继承体系获取父类Adapter 中的方法;
后者是通过构造方法传入Adapter对象实例,调用Adapter中的方法
相同的类不再重复,下面给出ObjectAdapter 和 ClientTest
public class ObjectAdapter implements Target{private Adapter adapter;public ObjectAdapter(Adapter adapter){this.adapter = adapter;}public void request() {adapter.specificRequest();}
}
public class ClientTest{public static void main(String[] args){Target target = new ObjectAdapter(new Adapter());target.request();}
}
输出结果为:
适配器中的业务代码
ClassAdapter类,通过继承 Adapter类,实现 Target 接口,完成 Adapter -> Target 的适配
接下来举个常见的例子。
日常生活中,常见的是220V的交流电,而我们电子设备上不需要这么大的电压,所以使用适配器将其转换为5V的电压。
我们以类适配器为例:
被适配的类:Voltage220V
适配接口:IVoltage5V
适配器类:VoltageAdapter
用电器:Phone
public class Voltage220V{public int out220V(){System.out.println("电压220V");return 220;}
}public interface IVoltage5V{int out5V();
}public class VoltageAdapter extends Voltage220V implements IVoltage5V{public int out5V(){int srcOut = super.out220V();int targetOut = srcOut / 44;return targetOut;}
}public class Phone(){public void charge(IVoltage5V voltage){int out = voltage.out5V();if(out == 5){System.out.println("电压是5v,可以充电"); }else{ System.out.println("电压不是5v,无法充电"); }}
}public class ClientTest{public static void main(String[] args){IVoltage5V voltage = new VoltageAdapter();Phone phone = new Phone();phone.charge(voltage);}
}
执行后,输出结果为:
电压220V
电压是5v,可以充电
以上就是适配器模式的全部内容,感谢阅读。