信息发布→ 登录 注册 退出

c++如何实现适配器模式 c++设计模式之Adapter【实例】

发布时间:2026-01-06

点击量:
适配器模式通过适配器类将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 的原方法
    }
};

使用方式:

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)。
标签:# 已有  # 三类  # 转换为  # 转换成  # 而非  # 将其  # 适用于  # 句柄  # 更灵活  # 是一个  # c++  # 对象  # 泛型  # 接口  # 纯虚函数  # 虚函数  # 多继承  # 继承  # 指针  # 封装  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!