适配器模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。
对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。
适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
假如我们这里有一个旧的Api,可能是之前的团队开发的,现在的客户端需要的是基于Target的接口
旧Api
/** * 旧的不兼容的接口 */ public class Api { void fa() { System.out.println("I am Api.fa()"); } }
需要的基于Target的接口
/** * 目标要求的接口 */ public interface Target { void f1(); }
旧API和新的客户端需求是不兼容的,这个时候我们就需要通过一个适配器来适配。
首先我们基于继承的方式来实现适配器
/** * 基于继承的适配器 */ public class ApiAdapter extends Api implements Target{ @Override public void f1() { System.out.println("I am ApiAdapter.f1()"); fa(); } } /** * 基于组合的适配器 */ public class ApiAdapter2 implements Target{ private Api api; public ApiAdapter2(Api api) { this.api = api; } @Override public void f1() { System.out.println("I am ApiAdapter2.f1()"); api.fa(); } }
客户端调用
public class Client { public static void main(String[] args) { ApiAdapter apiAdapter = new ApiAdapter(); apiAdapter.f1(); ApiAdapter2 apiAdapter2 = new ApiAdapter2(new Api()); apiAdapter2.f1(); } }
输出
I am ApiAdapter.f1()
I am Api.fa()
I am ApiAdapter2.f1()
I am Api.fa()