适配器模式通过适配器类将Adaptee接口转换为Target接口,含Target(目标接口)、Adaptee(被适配者)和Adapter(适配器)三角色;类适配器用多继承,对象适配器用组合更灵活。

适配器模式(Adapter Pattern)在 C++ 中用于让两个原本不兼容的接口能够协同工作。核心思路是:通过一个“适配器类”封装已有类,将其接口转换成目标客户期望的接口。
适配器模式的典型结构
包含三类角色:
- Target(目标接口):客户所期望使用的接口,通常是一个抽象类或纯虚函数接口。
- Adaptee(被适配者):已有功能类,但接口与 Target 不匹配(比如函数名、参数、返回值不同)。
- Adapter(适配器):继承 Target 并持有 Adaptee 实例(或继承 Adaptee),实现 Target 接口,内部调用 Adaptee 的对应方法做转换。
类适配器(继承式)示例
适用于 Adaptee 是类、且允许继承的场景(C++ 支持多继承,可同时继承 Target 和 Adaptee):
class Target {
public:
virtual ~Target() = default;
virtual void request() const = 0;
};
class Adaptee {
public:
void specificRequest() const {
std::cout << "Adaptee::specificRequest() called\n";
}
};
class Adapter : public Target, private Adaptee { // 多继承 + 私有继承避免暴露 Adaptee 接口
public:
void request() const override {
std::cout << "Adapter::request() -> ";
specificRequest(); // 调用 Adaptee 的原方法
}
};
使用方式:
立即学习“C++免费学习笔记(深入)”;
int main() {
Adapter adapter;
adapter.request(); // 输出:Adapter::request() -> Adaptee::specificRequest() called
}
对象适配器(组合式,更常用)
更灵活、符合“优先组合而非继承”原则,尤其当 Adaptee 是 final 类、或需运行时切换被适配对象时:
class Adapter : public Target {
private:
Adaptee adaptee_; // 组合 Adaptee 对象
public:
explicit Adapter(Adaptee a) : adaptee_(std::move(a)) {}
void request() const override {
std::cout << "Adapter::request() -> ";
adaptee_.specificRequest();
}
};
支持传入不同 Adaptee 实例,甚至可扩展为接受智能指针或接口引用,增强解耦性。
实际应用小技巧
- 适配器可添加额外逻辑:比如参数转换(单位换算)、异常包装、日志记录。
- 若 Adaptee 接口较复杂,适配器中可用私有辅助函数拆分转换逻辑,提升可读性。
- C++17 后可考虑用
std::variant或模板 + SFINAE 构建泛型适配器,但简单场景直接写具体类更清晰。 - 注意资源管理:若 Adaptee 持有资源(如文件句柄),适配器应正确处理生命周期(如转发移动语义、声明 noexcept)。











