Java 中的适配器模式:无缝集成不兼容的系统
也称为
- 包装器
适配器设计模式的意图
Java 中的适配器设计模式将一个类的接口转换为客户期望的另一个接口,从而实现兼容性。
适配器模式的详细解释及实际案例
现实世界的例子
假设你的存储卡中有一些图片,你需要将它们传输到电脑上。为了传输,你需要一个与电脑端口兼容的适配器,以便将存储卡连接到电脑。在这种情况下,读卡器就是一个适配器。另一个例子是著名的电源适配器;三脚插头无法连接到两脚插座,需要使用一个电源适配器使其与两脚插座兼容。另一个例子是翻译,翻译将一个人说的词语翻译成另一个人可以理解的词语。
简单来说
适配器模式允许你将一个不兼容的对象包装到一个适配器中,使其与另一个类兼容。
维基百科说
在软件工程中,适配器模式是一种软件设计模式,它允许将现有类的接口用作另一个接口。它通常用于使现有类在不修改其源代码的情况下与其他类一起工作。
Java 中适配器模式的编程示例
Java 中的适配器模式示例展示了如何将一个具有不兼容接口的类改造成与另一个类一起工作。
想象一个想成为船长的家伙,他只会使用划桨船,但完全不会航海。
首先,我们有 RowingBoat
和 FishingBoat
接口
public interface RowingBoat {
void row();
}
@Slf4j
public class FishingBoat {
public void sail() {
LOGGER.info("The fishing boat is sailing");
}
}
船长希望实现 RowingBoat
接口才能移动。
public class Captain {
private final RowingBoat rowingBoat;
// default constructor and setter for rowingBoat
public Captain(RowingBoat rowingBoat) {
this.rowingBoat = rowingBoat;
}
public void row() {
rowingBoat.row();
}
}
现在,假设海盗来了,我们的船长需要逃跑,但只有一艘渔船可用。我们需要创建一个适配器,使船长能够用他的划桨船技巧操作渔船。
@Slf4j
public class FishingBoatAdapter implements RowingBoat {
private final FishingBoat boat;
public FishingBoatAdapter() {
boat = new FishingBoat();
}
@Override
public void row() {
boat.sail();
}
}
现在,Captain
可以使用 FishingBoat
逃脱海盗。
public static void main(final String[] args) {
// The captain can only operate rowing boats but with adapter he is able to
// use fishing boats as well
var captain = new Captain(new FishingBoatAdapter());
captain.row();
}
程序输出
10:25:08.074 [main] INFO com.iluwatar.adapter.FishingBoat -- The fishing boat is sailing
何时在 Java 中使用适配器模式
在以下情况下,在 Java 中使用适配器模式
- 你想使用一个现有的类,但它的接口与你需要的接口不匹配
- 你想创建一个可重用的类,它与不相关或不可预见的类协作,即接口不兼容的类
- 你需要使用几个现有的子类,但通过子类化所有子类来适配它们的接口是不切实际的。对象适配器可以适配其父类的接口。
- 大多数使用第三方库的应用程序都使用适配器作为应用程序和第三方库之间的中间层,以将应用程序与库分离。如果需要使用另一个库,只需为新库创建适配器,而无需更改应用程序代码。
适配器模式 Java 教程
适配器模式的优缺点
类适配器和对象适配器具有不同的优点和缺点。类适配器通过绑定到特定适配者类将适配者适配到目标,这意味着它无法适配一个类及其所有子类。这种类型的适配器允许适配器重写适配者的某些行为,因为适配器是适配者的子类。此外,它只引入一个对象,而不需要额外的指针间接访问适配者。
另一方面,对象适配器允许单个适配器与多个适配者一起工作,包括适配者及其所有子类。这种类型的适配器可以同时为所有适配者添加功能。但是,它使重写适配者的行为变得更加困难,因为它需要子类化适配者,并让适配器引用该子类而不是适配者本身。
Java 中适配器模式的实际应用
- Java IO 库中的
java.io.InputStreamReader
和java.io.OutputStreamWriter
。 - 允许插件或适配器在不同 GUI 组件接口之间转换的 GUI 组件库。
- java.util.Arrays#asList()
- java.util.Collections#list()
- java.util.Collections#enumeration()
- javax.xml.bind.annotation.adapters.XMLAdapter