定义:将一个类的接口转换成客户希望的另一个类的接口。使原本由于接口不兼容不能工作的类可以一起工作
关于适配器,举个很简单的例子:我们以前买的水货手机,原装的充电器一般不能在国内使用,这个时候就需要转换头(适配器)来帮忙以达到国内使用的目的。
代码中分为三种,1类的适配器模式,2对象的适配器模式,3接口适配器
我们先来看看类的适配器模式的类图
其中:
Targetable:目标接口,所期待获得的接口
Source:目标源,需要进行适配的类
adapter:适配器,把元借款转换成目标接口
下面我们用代码实现
public interface Targetable {
//目标接口
void method1();
void method2();
}
public class Source {
public void method1(){
System.out.print("这是source的方法method1");
};
}
public class Adapter extends Source implements Targetable {
@Override
public void method2() {
System.out.print("这是adapter适配的方法method2");
}
}
最后是测试类
public class Test {
public static void main(String[] args) {
Targetable targetable=new Adapter();
targetable.method1();
targetable.method2();
}
}
输出:这是source的方法method1
这是adapter适配的方法method2
这样经过适配后targetable接口的实现类拥有了source类的功能
对象的适配器模式
与类的适配器模式不同的是,对象的适配器不采用继承的 关系连接到source类,而是采用委派的关系连接。
下面是实现代码,在类的适配器模式上稍加改变
public interface Targetable {
//目标接口
void method1();
void method2();
}
public class Source {
public void method1(){
System.out.print("这是source的方法method1");
};
}
public class Adapter implements Targetable {
private final Source source;
public Adapter(Source source) {
this.source=source;
}
@Override
public void method1() {
source.method1();
}
@Override
public void method2() {
System.out.print("这是adapter适配的方法method2");
}
}
最后是测试类
public class Adapter implements Targetable {
private final Source source;
public Adapter(Source source) {
this.source=source;
}
@Override
public void method1() {
source.method1();
}
@Override
public void method2() {
System.out.print("这是adapter适配的方法method2");
}
}
结果和上面一模一样
接口适配器模式:
首先我们看一下类图:
该模式也称谓缺省适配器,主要是因为我们一个接口中可能有多个抽象方法,我们写该类的实现类的时候,必须要实现所有方法,一些方法非必须的,这明显比较浪费,因为不是所有的方法都是我们需要的,这个时候我们借助一个抽象类,该类实现了该接口,我们继承该类重写我们需要的方法即可。
该方法较为简单,不再代码举例
类的适配器,主要针对适配目标为接口的情况下使用
对象的适配器,一般针对适配对象为类的情况下进行使用。
适配器模式的优点:
1 更好的复用性
2 更好的拓展性
缺点:
适配器一般是补救措施,不应当首先考虑使用,该模式会让系统凌乱,不易整体把握。比方说明明看到调用A的接口,实际上适配器内部调用的是B的接口的实现。