贝利信息

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

日期:2026-01-06 00:00 / 作者:冰火之心
适配器模式通过适配器类将Adaptee接口转换为Target接口,含Target(目标接口)、Adaptee(被适配者)和Adapter(适配器)三角色;类适配器用多继承,对象适配器用组合更灵活。

适配器模式(Adapter Pattern)在 C++ 中用于让两个原本不兼容的接口能够协同工作。核心思路是:通过一个“适配器类”封装已有类,将其接口转换成目标客户期望的接口。

适配器模式的典型结构

包含三类角色:

类适配器(继承式)示例

适用于 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 实例,甚至可扩展为接受智能指针或接口引用,增强解耦性。

实际应用小技巧