适配器模式:将一个类的接口转换为调用方希望的另一个接口,使得原本不兼容的接口变得可兼容共同工作
举一个生活中的例子来解释适配器模式如下:
适配器模式种分为3大角色
适配器模式分为3种:
下面分别对他们进行介绍
以手机充电器为例来介绍类适配器模式:充电器将220V交流电转换为5V直流电这一过程。其中的角色如下
简易的类图结构如下:

目标接口,定义一个将220转换为5v的接口,作为一个标准,提供给各个厂商的电源适配器使用
1 | public interface IOutput5V { |
被适配类,电源插座,提供220v的直流电,不能被手机直接使用
1 | public class Output220V { |
适配器类,继承了被适配类,实现目标接口具体的适配转换逻辑
1 | public class Adapter220To5 extends Output220V implements IOutput5V { |
以上便完成了主要的角色实现,编写手机的充电方法进行测试
1 | public class Phone { |
运行后输出结果如下:
1 | 电源输出电压:220V |
适配器的实现过程中是继承了被适配类同时实现目标接口的方式,这样的原因是受Java单继承的限制,所以在类适配器模式下算是一个小小的缺点,使用继承大大的增加了适配器的复杂度。
基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承待适配类,而是持有待适配类的实例,以解决兼容性的问题。 即:持有待适配类,实现目标接口,完成兼容性适配
依然按照上文的场景和角色只有适配器类的变动,类图关系如下

从原本的继承被适配类转变为持有被适配类的实例。涉及到代码修改的只有适配器类:Adapter220To5.java
1 | public class Adapter220To5 implements IOutput5V { |
适配器类在需要持有被适配类的实例,所以在Phone充电方法中传入被适配类的对象
1 | public class Phone { |
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
接口适配器模式适用于一个接口不想使用其所有的方法的情况
简单的类图结构如下:

假定现在的目标接口定义了输出5v、输出20v、输出60v的方法
1 | public interface IOutput { |
定义抽象类默认实现目标接口,并持有待适配的对象实例
1 | public abstract class AbsAdapter implements IOutput{ |
当需要使用到输出5v的转换时,或者需要使用输出10v转换时,使用匿名内部类的方式实现内部适配细节
1 | public class Phone { |
输出结果:
1 | 电源输出电压:220V |
主要优点:
适用场景:
适配器模式:将一个类的接口转换为调用方希望的另一个接口,使得原本不兼容的接口变得可兼容共同工作
举一个生活中的例子来解释适配器模式如下:
适配器模式种分为3大角色
适配器模式分为3种:
下面分别对他们进行介绍
以手机充电器为例来介绍类适配器模式:充电器将220V交流电转换为5V直流电这一过程。其中的角色如下
简易的类图结构如下:

目标接口,定义一个将220转换为5v的接口,作为一个标准,提供给各个厂商的电源适配器使用
1 | public interface IOutput5V { |
被适配类,电源插座,提供220v的直流电,不能被手机直接使用
1 | public class Output220V { |
适配器类,继承了被适配类,实现目标接口具体的适配转换逻辑
1 | public class Adapter220To5 extends Output220V implements IOutput5V { |
以上便完成了主要的角色实现,编写手机的充电方法进行测试
1 | public class Phone { |
运行后输出结果如下:
1 | 电源输出电压:220V |
适配器的实现过程中是继承了被适配类同时实现目标接口的方式,这样的原因是受Java单继承的限制,所以在类适配器模式下算是一个小小的缺点,使用继承大大的增加了适配器的复杂度。
基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承待适配类,而是持有待适配类的实例,以解决兼容性的问题。 即:持有待适配类,实现目标接口,完成兼容性适配
依然按照上文的场景和角色只有适配器类的变动,类图关系如下

从原本的继承被适配类转变为持有被适配类的实例。涉及到代码修改的只有适配器类:Adapter220To5.java
1 | public class Adapter220To5 implements IOutput5V { |
适配器类在需要持有被适配类的实例,所以在Phone充电方法中传入被适配类的对象
1 | public class Phone { |
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
接口适配器模式适用于一个接口不想使用其所有的方法的情况
简单的类图结构如下:

假定现在的目标接口定义了输出5v、输出20v、输出60v的方法
1 | public interface IOutput { |
定义抽象类默认实现目标接口,并持有待适配的对象实例
1 | public abstract class AbsAdapter implements IOutput{ |
当需要使用到输出5v的转换时,或者需要使用输出10v转换时,使用匿名内部类的方式实现内部适配细节
1 | public class Phone { |
输出结果:
1 | 电源输出电压:220V |
主要优点:
适用场景: