适配器模式
适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计模式。它允许不兼容的接口协同工作,通过创建一个适配器类来转换某个类的接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
ok,概念还是太抽象了。来个例子就生动一点。
我们举个手机充电的例子,我们充电头适配的是国内的电网。可是我们国家的电网工作电压与频率不一定与国外的一样,如果我们需要去国外生活或者旅游,怎么办呢? 首先下面我们展示两种充电插头,一种是国标的,另一种是国外的。
我们会怎么办呢? 一般来说,我们会买一个充电转换头
这样的话,我们的充电器就可以在国外正常使用了。其实这样一种实现,就是适配器模式(Adapter Pattern)的体现。
适配器模式(Adapter Pattern)概述
- 适配器模式定义与目的
- 定义:适配器模式是一种结构型设计模式,它使接口不兼容的对象能够协作。适配器充当两个不兼容接口之间的桥梁。
- 目的:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 适配器模式的实现方式
在Java中,我们主要通过组合或聚合的方式,在适配器内部包含一个对适配者的引用。
代码案例
java">// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;// 构造函数注入适配者public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void do() {adaptee.does();}
}
talk is cheap, show you my code
我们通过代码构造充电头那个案例。不过我们是让国外的充电实例(充电头)在中国能使用。
java">// 国外充电接口
interface ForeignCharge {void charge(double time);
}// 国内充电接口
interface ChinaCharge {void chongDian(double time);
}// 国外充电接口的实现
class ForeignChargeImpl implements ForeignCharge {@Overridepublic void charge(double time) {System.out.println("charging " + time + " hours");}
}// 适配器类
class ChargeAdapter implements ChinaCharge {private final ForeignCharge foreignCharge;public ChargeAdapter(ForeignCharge foreignCharge) {this.foreignCharge = foreignCharge;}@Overridepublic void chongDian(double time) {// 调用国外充电方法foreignCharge.charge(time);}
}// 客户端代码
public class Test1 {public static void main(String[] args) {// 创建国外充电实例ForeignCharge foreignCharge = new ForeignChargeImpl();// 创建适配器实例ChargeAdapter adapter = new ChargeAdapter(foreignCharge);// 使用适配器调用国外充电实例adapter.chongDian(1.00);}
}
代码详解
ForeignCharge 接口
- 作用:定义了一个国外使用的充电接口。
- 方法:charge(double time) - 表示充电的时间。
ChinaCharge 接口
- 作用:定义了一个国内使用的充电接口。
- 方法:chongDian(double time) - 表示充电的时间。
ForeignChargeImpl 类实现ForeignCharge 接口方法
ChargeAdapter 类
- 作用:适配器类,实现了 ChinaCharge 接口,并持有一个 ForeignCharge 对象。
- 构造方法:ChargeAdapter(ForeignCharge foreignCharge):接受一个 ForeignCharge 对象并存储在 foreignCharge 成员变量中。
- 方法:chongDian(double time):调用 foreignCharge 的 charge 方法来完成充电操作。
客户端类步骤详解
- 创建一个 ForeignChargeImpl 实例,表示国外的充电设备。
- 创建一个 ChargeAdapter 实例,并将 ForeignChargeImpl 实例传递给适配器。
- 通过适配器调用 chongDian 方法,实际执行的是 ForeignChargeImpl 的 charge 方法。
总结
- 提高代码复用性
- 增加灵活性,因为我们可以灵活选择要适配的对象
- 降低耦合, 适配者变化的时候,我们只需要修改适配器代码,客户端可以正常使用
- 适配器模式应用场景:
- 遗留系统集成:当你有一个新的系统需要与旧系统中的某些类交互时,可以使用适配器模式来解决接口不匹配的问题。
- 第三方库集成:当你想使用第三方库中的类,但这些类的接口不符合你的需求时,适配器模式可以帮助你进行转换。
- API 升级:在升级 API 或更换框架时,适配器模式可以帮助平滑过渡,确保现有代码继续正常工作。
适配器模式是一种非常实用的设计模式,特别是在需要整合现有代码或第三方库时。理解如何正确使用适配器模式可以帮助开发者更有效地组织代码并优化程序设计。