概述
适配器模式,顾名思义,就是把原本不兼容的接口,通过适配,使之兼容。
举个生活中简单的例子,以前的手机内存卡可以取出来,但是想和电脑之间传输音乐、视频等资料不能直接传输,需要通过USB读卡器,然后插入USB接口就可以传输了,这个USB读卡器就相当于适配器。
你经常使用的手机或电脑充电器,也属于适配器,它将220V的交流电转换为手机可用的直流电。下面,以手机充电器为例讲解适配器模式。
模式中的角色
1.目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。
2.需要适配的类(Adaptee):需要适配的类或适配者类
3.适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
实现方式
类的适配器模式(采用继承实现)
类适配器是通过继承源类,实现目标接口的方式实现适配的。但是,由于Java单继承的机制,这就要求目标必须是接口,有一定的局限性。
public class AC220V {
public int output220v() {
int output220v = 220;
return output220v;
}
}
public interface DC5V {
int dc5v();
}
public class Adapter extends AC220V implements DC5V{
@Override
public int dc5v() {
int output220v = output220v();
return (output220v / 44);
}
}
/**
* @Description: 基于类的适配器模式
*/
public class Test {
public static void main(String[] args) {
DC5V dc5V = new Adapter();
int dc5 = dc5V.dc5v();
System.out.println("转换后的电压为:" + dc5 + " 伏...");
}
}
对象适配器模式(采用对象组合方式实现)
对象适配器,不是继承源类,而是依据关联关系,持有源类的对象,这也隐藏了源类的方法。在这里,适配器和源类的关系不是继承关系,而是组合关系。
public class AC220V {
public int output220v() {
int output220v = 220;
return output220v;
}
}
public interface DC5V {
int dc5v();
}
public class Adapter implements DC5V{
private AC220V ac220V;
public Adapter(AC220V ac220V) {
this.ac220V = ac220V;
}
@Override
public int dc5v() {
int output220v = ac220V.output220v();
return (output220v / 44);
}
}
/**
* @Description: 基于对象的适配器模式
*/
public class Test {
public static void main(String[] args) {
DC5V dc5V = new Adapter(new AC220V());
int dc5 = dc5V.dc5v();
System.out.println("输入的电压为:" + new AC220V().output220v() + " 伏...");
System.out.println("转换后的电压为:" + dc5 + " 伏...");
}
}
接口适配器模式(缺省适配器模式)
设想,我现在的目标接口有多个方法,可以输出5V,12V,20V的电压。按照正常逻辑,设计一个适配器去实现这个接口,很显然需要实现所有的方法。但是,实际使用中,其实只需要使用其中一个方法就可以了,比如我mac电脑直流电压20V,只需要实现20V的方法就可以了。
因此,设计一个中间类去把目标接口的所有方法空实现,然后适配器类再去继承这个中间类,选择性重写我所需要的方法。
public class AC {
public int outputAC(){
return 220;
}
}
public interface DCOutput {
public int output5V();
public int output12V();
public int output20V();
}
public abstract class DefaultAdapter implements DCOutput{
@Override
public int output5V() {
return 0;
}
@Override
public int output12V() {
return 0;
}
@Override
public int output20V() {
return 0;
}
}
public class MacAdatper extends DefaultAdapter {
private AC ac;
public MacAdatper(AC ac) {
this.ac = ac;
}
@Override
public int output20V() {
return ac.outputAC() / 11;
}
public static void main(String[] args) {
MacAdatper adatper = new MacAdatper(new AC());
System.out.println("mac电脑电压:" + adatper.output20V());
}
}
总结
类适配器模式,继承源类,实现目标接口。
对象适配器模式,持有源类的对象,把继承关系改变为组合关系。
接口适配器模式,借助中间抽象类空实现目标接口所有方法,适配器选择性重写。