将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原 本由于接口不兼容而不能一起工作的那些类可以一起工作。
—Gang of Four
适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不能一起工作的类能够在一起工作,
做法是将类自己的接口包裹在一个已存在的类中。
适配器模式类图
所示是适配器模式的类图。Adapter 适配器设计模式中有 3 个重要角色:被适配者 Adaptee,适配器 Adapter 和目标对象 Target。
其中两个现存的想要组合到一起的类分别是被适配者 Adaptee 和目标对象 Target 角色,按照类图所示,我们需要创建一个适配器
Adapter 将其组合在一起。
具体代码实现如下:
客户端使用的接口
/**
* 定义客户端使用的接口
*
*/
public interface Target {
/**
* 客户端请求处理的方法
*/
public void foo();
}
被适配的对象
/**
* 已经存在的接口
*
*/
public class Adaptee {
/**
* 原本存在的方法
*/
public void specificFoo() {
// 业务代码
}
}
适配器实现
/**
* 适配器类
*
*/
public class Adapter implements Target {
/**
* 持有需要被适配的接口对象
*/
private Adaptee adaptee;
/**
* 构造方法,传入需要被适配的对象
*
* @param adaptee 需要被适配的对象
*/
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void foo() {
System.out.println("hello adaptee");
}
}
客户端代码
public class Client {
public static void main(String[] args) {
// 创建需要被适配的对象
Adaptee adaptee = new Adaptee();
// 创建客户端需要调用的接口对象
Target target = new Adapter(adaptee);
// 请求处理
target.foo();
}
}
以下情况比较适合使用 Adapter 模式:
当你想使用一个已经存在的类,而它的接口不符合你的需求;
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作;
你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父亲接口。