定义:
将一个类的接口转换成客户端期望的另一个接口。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。
简单的讲就是客户期望调用我们已存的代码功能,但客户已经定义好了自己的接口标准,为了使我们已有的代码能适用客户的接口,所以需要用到适配器模式。
该模式定义的角色有一下三种:
- Target:使用者所期待得到的接口
- Adaptee:具体调用类中的方法
- Adapter:将原有接口转换成Target所描述的接口
适配器模式主要以两种方式实现:
- 类适配模式
- 对象适配器模式
举个生活中常见的例子: 为手机充电。
手机需要电但无法直接从电源上获得(这里忽略带交流电源的山寨手机),所以有了充电器这个适配器,来适配手机与电源的接口,从而能正常充电。
1.类适配器
Target(手机充电接口):
public interface Target {
public void electricize();
}
Adaptee(电源):
public class Adaptee {
public void getElectricity() {
System.out.println("获取电流......");
}
}
Adapter(适配器):
public class AdapterClass extends Adaptee implements Target{
public void electricize() {
this.getElectricity();
}
}
Test:
public class Test {
public static void main(String args[]) {
AdapterClass adapterClass = new AdapterClass();
adapterClass.electricize();
}
}
2.对象适配器
更换Adapter代码为以下:
public class AdapterObject implements Target{
private Adaptee adaptee;
public AdapterObject(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void electricize() {
adaptee.getElectricity();
}
}
Test:
public class Test {
public static void main(String args[]) {
AdapterObject adapterObject = new AdapterObject(new Adaptee());
adapterObject.electricize();
}
}
类适配器与对象适配器:
整体看类适配器是基于集成的概念,而对象适配器更类似于一种组合的概念。
对象适配器的一些应用场景:
当客户无法给出明确接口或客户提出的接口为抽象类时。
客户接口:
public abstract class AbstractTarget {
abstract public void electricize();
}
适配器:
public class AdapterObject extends AbstractTarget {
private Adaptee adaptee;
public AdapterObject(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void electricize() {
adaptee.getElectricity();
}
}