适配器模式通过适配器类将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 实例,甚至可扩展为接受智能指针或接口引用,增强解耦性。
std::variant 或模板 + SFINAE 构建泛型适配器,但简单场景直接写具体类更清晰。
如文件句柄),适配器应正确处理生命周期(如转发移动语义、声明 noexcept)。