实际生活中的应用
情境:
你有一个老款的手机充电器,它使用的是Micro USB接口,而你新买的手机使用的是USB-C接口。这两个接口不兼容,但你并不想购买新的充电器。那么,你可以使用一个适配器,将Micro USB接口转换成USB-C接口,这样老款充电器就能给新手机充电了。
解释:
这个适配器就是我们所谓的“适配器模式”:它将一个不兼容的接口转换成另一个接口,使得两个本来不能一起工作的设备可以协同工作。
代码示例
假设我们有一个老的接口(旧系统)和一个新的接口(新系统),我们希望通过适配器使二者协同工作。
旧系统接口:
class OldSystem {
public:
void oldRequest() {
std::cout << "Using old system request." << std::endl;
}
};
新系统接口:
class NewSystem {
public:
virtual void newRequest() = 0; // New interface that clients expect
};
适配器类:
class Adapter : public NewSystem {
private:
OldSystem* oldSystem;
public:
Adapter(OldSystem* os) : oldSystem(os) {}
void newRequest() override {
oldSystem->oldRequest(); // Translate the new request to the old request
}
};
使用适配器类:
int main() {
OldSystem* oldSystem = new OldSystem();
NewSystem* adapter = new Adapter(oldSystem);
adapter->newRequest(); // The client uses the new interface which gets adapted to the old one
delete adapter;
delete oldSystem;
return 0;
}
完整代码
#include <iostream>
// 旧系统接口
class OldSystem {
public:
void oldRequest() {
std::cout << "Using old system request." << std::endl;
}
};
// 新系统接口
class NewSystem {
public:
virtual void newRequest() = 0; // New interface that clients expect
};
// 适配器类
class Adapter : public NewSystem {
private:
OldSystem* oldSystem; // 持有一个旧系统实例
public:
Adapter(OldSystem* os) : oldSystem(os) {}
void newRequest() override {
oldSystem->oldRequest(); // 将新请求适配到旧的请求
}
};
// 客户端代码
int main() {
OldSystem* oldSystem = new OldSystem(); // 创建旧系统实例
NewSystem* adapter = new Adapter(oldSystem); // 创建适配器实例
adapter->newRequest(); // 客户端使用新的接口,实际调用的是旧系统的接口
// 清理内存
delete adapter;
delete oldSystem;
return 0;
}
解释
- OldSystem:表示旧的系统接口,提供一个旧的请求方法
oldRequest
。 - NewSystem:表示新的系统接口,是客户期望的接口,定义了一个虚的
newRequest
方法。 - Adapter:适配器类,它实现了
NewSystem
接口,并持有一个OldSystem
的实例。在newRequest
方法中,它调用OldSystem
的oldRequest
方法,从而实现了旧接口到新接口的转换。 - main:客户端代码,它创建一个
OldSystem
实例和一个适配器实例。客户端通过适配器调用newRequest
方法,实际上会调用旧系统的oldRequest
方法。
这个例子显示了如何使用适配器模式来解决接口不兼容的问题,使得原本由于接口不同而不能协同工作的类可以平稳地协作。