介绍
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类可以协同工作,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
1.定义
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容而无法一起工作的类可以一起工作。
2. 主要作用
- 接口兼容:使得两个不兼容的接口能够工作在一起。
- 解耦:通过适配器将客户端与被适配者解耦,减少了系统的耦合性。
- 重用性:允许现有的类在不修改的情况下被复用,提高了代码的重用性。
3. 解决的问题
- 当现有类的接口和需求的接口不兼容时,适配器模式可以将现有接口转换成所需接口。
- 在不修改现有类的前提下,使其能够适应新的接口需求,充分复用现有代码。
4. 模式原理
包含角色:
- Target(目标接口): 客户端期望的接口。
- Adapter(适配器): 实现了目标接口,并且持有一个被适配对象的实例。
- Adaptee(被适配的类): 原本存在的接口或类。
UML类图:
代码示例:
// 目标接口
interface Printer {
void print(String content);
}
// 旧类(不兼容的接口)
class OldPrinter {
void printText(String text) {
System.out.println("OldPrinter: " + text);
}
}
// 适配器类
class PrinterAdapter implements Printer {
private OldPrinter oldPrinter;
public PrinterAdapter(OldPrinter oldPrinter) {
this.oldPrinter = oldPrinter;
}
@Override
public void print(String content) {
// 在适配器中处理图像打印的逻辑
String textContent = convertImageToText(content);
oldPrinter.printText(textContent);
}
// 假设这是一个将图像转换为文本的方法
private String convertImageToText(String image) {
return "Converted Image: " + image;
}
}
调用
public class AdapterPatternDemo {
public static void main(String[] args) {
OldPrinter oldPrinter = new OldPrinter();
Printer printerAdapter = new PrinterAdapter(oldPrinter);
// 客户端使用适配器打印图像
printerAdapter.print("SampleImage.jpg");
}
}
打印输出
OldPrinter: Converted Image: SampleImage.jpg
适配器在我们的生活中无处不在,帮助不同系统、设备和协议之间实现兼容与互通比如电源适配器,耳机适配器,家用电器的转换插头,文件格式转换等等…
正如你想的那样,将一种不可使用的东西,通过一系列适配达到可用状态,这就是适配器模式的含义。
在Java中InputStreamReader
可以被视为适配器,将字节流(InputStream
)转换为字符流(Reader
)
InputStream inputStream = new FileInputStream("xxx.txt");
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
Java的集合框架中,Collections
类提供了多个适配器方法,例如ListIterator
。它允许对List集合进行双向迭代。
List<String> list = new ArrayList<>();
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
在安卓中,适配器的含义是将数据转化成UI显示出来。例如RecyclerView.Adapter
是一个典型的适配器模式示例。RecyclerView
本身并不知道数据的来源,适配器充当了RecyclerView
和数据之间的桥梁。
其实适配器真没啥介绍的,大家已经熟悉的不能再熟悉了,此篇文章就当用来帮助大家加固下对适配器模式的印象吧!😜
5. 优缺点
优点:
- 单一职责原则:将接口转换代码封装在适配器中,不需要修改原有类。
- 开闭原则:添加新的适配器,不需要修改已有代码。
- 提高复用性:可以复用现有类,减少代码重复。
缺点:
- 复杂性增加:引入适配器模式会增加系统的复杂性,增加了额外的类。
- 类适配器的局限性:类适配器使用多重继承,可能不适用于所有面向对象语言(如Java只支持单继承)。
6. 应用场景
- 需要与不兼容的接口或类库进行集成。
- 需要使用现有类的功能,但它们的接口不符合客户端的要求。
- 在系统中需要将多个不同的接口统一为一个接口。
7. 对象适配器(Object Adapter)和类适配器(Class Adapter)区别
特性 | 类适配器(Class Adapter) | 对象适配器(Object Adapter) |
---|---|---|
实现方式 | 通过继承(类) | 通过组合(对象) |
适配方式 | 编译时适配 | 运行时适配 |
灵活性 | 不够灵活,适配关系固定 | 灵活,适配对象可以在运行时更改 |
对变化的影响 | 被适配类变化影响较大 | 被适配类变化影响较小 |
8. 总结
适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户端期望的接口,使得原本不兼容的类可以一起工作。它主要解决接口不兼容的问题,提高代码的复用性和灵活性。虽然引入了额外的复杂性,但它在需要复用现有代码,或者在不修改源代码的前提下适应新接口需求的场景下,非常有用。适配器模式有类适配器和对象适配器两种实现方式,各自有优缺点,选择时应根据具体需求和语言特性来决定。