适配器模式的含义
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间进行交互。适配器模式通过创建一个中间层,即适配器,来实现两个不兼容的接口的兼容。适配器接收对一个接口的调用请求,将其转化为另一个接口的一种兼容形式,并将其传递给可以理解该请求的对象。
核心思想及解释
适配器模式的核心思想是转换接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器改变接口的表现形式而不改变其本身的行为,达到软件组件的复用与扩展。
为什么要使用适配器模式
- 接口不兼容问题: 当希望使用某些现有的类,但其接口与其他代码不兼容时,可以使用适配器模式而无需修改原有代码。
- 统一多个类的接口: 当需要统一多个不同接口的行为并使它们可以一起工作时,使用适配器可以提供统一的解决方案。
- 增加类的透明性和复用: 适配器可以让客户从实现细节中解耦,通过新的接口使用同一个类。
使用适配器模式需要注意的点
- 不要过度使用: 仅在确实需要转换接口时使用适配器模式,否则可能会使系统复杂化。
- 设计前的考虑: 在添加新的适配器之前,应该考虑是否有可能通过修改现有系统的架构来满足需求,而不是简单地添加适配器。
工程的应用场景
- 遗留代码的集成: 当需要将遗留代码或第三方库集成到现有系统中时,适配器可以使这些代码与现有的系统环境兼容。
- 接口不一致的问题: 当两个组件或类所提供的接口不一致,但功能相似,希望它们可以一起工作时。
- 系统的扩展性: 当预期到系统可能需要与未来的产品或系统交互时,适配器可以作为一种预防措施来设计系统。
示例代码及解释
假设我们有一个现有的类 OldPrinter
,它有一个打印方法 printOld()
,和新系统中的打印接口 NewPrinter
不兼容,NewPrinter
使用的方法是 printNew()
。我们将通过适配器模式使得 OldPrinter
能在新系统中使用。
定义旧的打印机类:
#include <iostream>
using namespace std;
// 旧的打印机类
class OldPrinter {
public:
void printOld() {
cout << "Print from Old Printer." << endl;
}
};
定义新的打印接口:
// 新的打印接口
class NewPrinter {
public:
virtual void printNew() = 0;
virtual ~NewPrinter() {}
};
定义适配器类:
// 适配器类
class Adapter : public NewPrinter {
private:
OldPrinter* oldPrinter;
public:
Adapter(OldPrinter* printer) : oldPrinter(printer) {}
void printNew() override {
oldPrinter->printOld(); // 调用旧的打印方法
}
~Adapter() {
delete oldPrinter;
}
};
客户端代码:
int main() {
OldPrinter* oldPrinter = new OldPrinter();
NewPrinter* printer = new Adapter(oldPrinter);
printer->printNew(); //
通过新接口使用旧的打印机
delete printer;
return 0;
}
输出代码运行结果
Print from Old Printer.
这个例子展示了如何使用适配器模式来让原本不兼容的 OldPrinter
类通过 NewPrinter
的接口被新系统使用。适配器 Adapter
实现了新的接口,并在内部调用了旧的打印方法,从而实现了接口的转换。这样旧的打印机就可以在新系统中无缝使用,而无需修改旧类的代码。