适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换成客户端希望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作。适配器模式的主要目的是兼容性和重用性,特别是在使用一些已有的类,而它们的接口又不符合要求时。
适配器模式的核心思想
适配器模式的核心是将一个类的接口转换为客户端期望的另一个接口,从而实现类之间的兼容。它就像是一个“适配器插头”,可以让本来不兼容的接口顺利对接。
适配器模式的两种类型
-
类适配器模式(使用继承实现)
-
对象适配器模式(使用组合实现)
1. 类适配器模式
类适配器模式使用继承的方式来实现适配器。它通过继承一个已有的类,并实现目标接口,使得适配器可以“表现”成目标接口的类型。
优点:可以实现多个适配器之间的灵活转换。通过继承,可以直接访问被适配类的方法。
缺点:适配器类需要继承已有类,这限制了适配器类的灵活性,因为 Java 等语言中不支持多重继承,所以一个适配器类最多只能适配一个类。适配器与被适配类之间的耦合度较高。
示例: 假设有一个VGA接口
,但现在需要一个HDMI接口
来连接显示器,可以创建一个VGAAdapter
类来继承VGA
接口,并实现HDMI
接口。
// HDMI接口
interface HDMI {
void connectWithHDMI();
}
// VGA类
class VGA {
void connectWithVGA() {
System.out.println("使用VGA链接");
}
}
// VGA到HDMI的适配器
class VGAAdapter extends VGA implements HDMI {
@Override
public void connectWithHDMI() {
connectWithVGA(); // 调用VGA的方法实现HDMI的功能
System.out.println("调用HDMI");
}
}
2. 对象适配器模式
对象适配器模式使用组合的方式,将已有类的实例作为适配器的一个成员变量,通过调用这个实例的方法来完成适配。对象适配器模式更常用,因为它更加灵活,可以动态组合不同的适配器对象。
-
优点:
- 适配器与被适配类之间的耦合度较低,可以适配多个不同的类。
- 可以实现多个类的适配,只要这些类实现了适配器中的方法。
-
缺点:
- 需要在适配器中维护被适配对象的实例,会稍微增加复杂性。
示例: 以同样的VGA和HDMI接口为例,我们可以使用对象适配器模式来实现适配器。
// HDMI接口
interface HDMI {
void connectWithHDMI();
}
// VGA类
class VGA {
void connectWithVGA() {
System.out.println("使用VGA");
}
}
// VGA到HDMI的适配器(使用组合)
class VGAAdapter implements HDMI {
private VGA vga;
VGAAdapter(VGA vga) {
this.vga = vga;
}
@Override
public void connectWithHDMI() {
vga.connectWithVGA(); // 使用VGA对象的方法
System.out.println("采用HDMI");
}
}
适配器模式的应用场景
适配器模式非常适合在以下场景中使用:
- 希望复用一些现有的类,但这些类的接口不符合你的需求时。
- 需要将多个不兼容的接口集成到一个接口中时,可以使用适配器来封装。
- 在使用第三方库时,库的接口不能直接满足系统的需求,可以创建一个适配器来连接现有系统与第三方库。
- 接口不兼容但功能相似的类之间,适配器可以帮助它们协同工作。