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

14次阅读

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

c++如何实现适配器模式 c++设计模式之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() calledn";     } };  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)。

text=ZqhQzanResources