1. 适配器模式基础解析
适配器模式是结构型设计模式中的经典实现,它像电源转换插头一样解决接口不兼容问题。在实际开发中,我们经常会遇到需要整合新旧系统、对接第三方库或者统一不同模块接口的场景。适配器模式通过创建一个中间层,让原本由于接口不匹配而无法一起工作的类能够协同工作。
这个模式的核心价值在于:不修改已有代码的前提下实现功能扩展。根据我的项目经验,在以下三种典型场景特别适用:
- 系统升级时保留旧接口兼容性
- 整合不同厂商提供的SDK
- 单元测试中模拟真实服务
C++实现适配器模式有两大技术路线:类适配器(通过多重继承)和对象适配器(通过组合)。考虑到现代C++开发规范更推荐组合优于继承的原则,本文将重点演示对象适配器的实现方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整代码实现与解析
2.1 基础接口定义
我们先定义需要被适配的旧接口和目标接口。这是模式实现的基础骨架:
cpp复制// 需要被适配的旧接口(Adaptee)
class LegacyRectangle {
public:
void draw(int x1, int y1, int x2, int y2) {
std::cout << "LegacyRectangle: draw("
<< x1 << "," << y1 << ","
<< x2 << "," << y2 << ")"
<< std::endl;
}
};
// 目标接口(Target)
class Shape {
public:
virtual void draw(int x, int y, int width, int height) = 0;
virtual ~Shape() = default;
};
关键点说明:
LegacyRectangle使用两点坐标定义矩形Shape接口期望使用点坐标+宽高定义矩形- 两者参数格式不兼容但功能本质相同
2.2 适配器实现
下面是核心的适配器类实现,展示了如何转换接口调用:
cpp复制class RectangleAdapter : public Shape {
private:
LegacyRectangle adaptee; // 组合方式持有被适配对象
public:
void draw(int x, int y, int width, int height) override {
// 参数转换:将(x,y,width,height)转换为(x1,y1,x2,y2)
int x1 = x;
int y1 = y;
int x2 = x + width;
int y2 = y + height;
adaptee.draw(x1, y1, x2, y2); // 调用被适配对象的方法
}
};
这段代码展示了适配器模式的精髓:
- 继承目标接口保证类型兼容
- 组合方式持有被适配对象实例
- 在接口方法中完成参数转换
2.3 客户端使用示例
完整的客户端调用示例:
cpp复制int main() {
Shape* shape = new RectangleAdapter();
// 使用新接口调用旧功能
shape->draw(10, 20, 30, 40);
delete shape;
return 0;
}
输出结果:
code复制LegacyRectangle: draw(10,20,40,60)
