1. 适配器模式的核心概念
适配器模式是结构型设计模式中最常用的模式之一,它主要解决接口不兼容的问题。想象一下你从国外带回来的电器插头无法直接插入国内的插座,这时候你需要一个转换插头——这个转换插头就是适配器模式在现实生活中的完美体现。
在C++中,适配器模式通常用于以下场景:
- 需要使用现有的类,但其接口与其他代码不兼容
- 需要复用一些现有的子类,但这些子类缺少一些公共功能
- 需要创建一个能够与多个不相关类或接口协同工作的类
关键点:适配器不是新增功能,而是接口转换。它让原本因接口不匹配而无法一起工作的类能够协同工作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 适配器模式的两种实现方式
2.1 对象适配器(组合方式)
这是最常用的实现方式,通过组合关系将Adaptee对象作为Adapter的成员变量。让我们看一个完整的代码示例:
cpp复制#include <iostream>
#include <algorithm>
#include <string>
// 目标接口(客户端期望的接口)
class Target {
public:
virtual ~Target() = default;
virtual std::string Request() const {
return "Target: 标准目标行为";
}
};
// 需要适配的类(已有但接口不兼容的类)
class Adaptee {
public:
std::string SpecificRequest() const {
return ".eetpadA eht fo roivaheb laicepS";
}
};
// 适配器类
class Adapter : public Target {
private:
Adaptee* adaptee_; // 持有需要适配的对象
public:
Adapter(Adaptee* adaptee) : adaptee_(adaptee) {}
std::string Request() const override {
// 调用Adaptee的方法并进行转换
std::string to_reverse = this->adaptee_->SpecificRequest();
std::reverse(to_reverse.begin(), to_reverse.end());
return "适配器: (转换后) " + to_reverse;
}
};
// 客户端代码
void ClientCode(const Target* target) {
std::cout << target->Request() << std::endl;
}
int main() {
std::cout << "客户端: 我可以直接使用目标对象:\n";
Target* target = new Target;
ClientCode(target);
std::cout << "\n";
Adaptee* adaptee = new Adaptee;
std::cout << "客户端: Adaptee类有一个奇怪的接口,我看不懂:\n";
std::cout << "Adaptee: " << adaptee->SpecificRequest();
std::cout << "\n\n";
std::cout << "客户端: 但我可以通过适配器使用它:\n";
Adapter* adapter = new Adapter(adaptee);
ClientCode(adapter);
delete target;
delete adaptee;
delete adapter;
return 0;
}
输出结果:
code复制客户端: 我可以直接使用目标对象:
Target: 标准目标行为
客户端: Adaptee类有一个奇怪的接口,我看不懂:
Adaptee: .eetpadA eht fo roivaheb laicepS
客户端: 但我可以通过适配器使用它:
适配器: (转换后) Special behavior of the Adaptee.
2.2 类适配器(多重继承方式)
C++支持多重继承,因此我们可以使用继承方式实现适配器。这种方式下,Adapter
