适配器模式(Adapter Pattern)是一种结构型设计模式,它允许你将不兼容的接口转换为可兼容的接口。这使得之前无法一起工作的类可以通过适配器合作。适配器模式通常用作类之间接口的桥梁,是解决接口不兼容问题的手段。
核心思想
这个模式通过将一个类的接口转化为客户端希望的另一个接口,从而使原本由于接口不兼容而无法工作的类能够一起工作。适配器提供了封装已有类的能力,使得它可以与其他接口协作。
组成部分
-
客户类(Client):
- 依赖于目标接口进行操作,而不直接与不兼容接口交互。
-
目标接口(Target):
- 期望的接口,客户端依赖该接口进行交流。
-
需要适配的类(Adaptee):
- 已存在的接口或类,它不符合目标接口。
-
适配器(Adapter):
- 实现目标接口,并持有一个被适配类的引用,它将目标接口的方法调用转换为被适配类中相应的方法调用。
示例
以下是 C++ 中的适配器模式示例,描述了一个旧型第三方绘图类如何适配为现代客户端代码可以使用的新型绘图接口:
#include <iostream>
// 目标接口
class Shape {
public:
virtual void draw() const = 0;
virtual ~Shape() = default;
};
// 已有接口(被适配的类)
class LegacyRectangle {
public:
void oldDraw() const {
std::cout << "Drawing a rectangle using the legacy code." << std::endl;
}
};
// 适配器类,继承目标接口,并组合已有接口
class RectangleAdapter : public Shape {
public:
RectangleAdapter(LegacyRectangle& legacyRectangle)
: legacyRectangle_(legacyRectangle) {}
void draw() const override {
legacyRectangle_.oldDraw();
}
private:
LegacyRectangle& legacyRectangle_;
};
// 客户端代码
void clientCode(const Shape& shape) {
shape.draw();
}
int main() {
LegacyRectangle legacyRectangle;
RectangleAdapter adaptedRectangle(legacyRectangle);
clientCode(adaptedRectangle); // 这行代码将会使用适配器调用旧接口
return 0;
}
特点和优点
-
解决类适配问题:
- 适配器模式解决了接口不匹配的问题,可以让设计精巧但不兼容的接口共同工作。
-
封装旧接口:
- 可以在不修改现有代码的情况下,使用适配器调和新旧接口。
-
灵活性和可扩展性:
- 通过在适配器中定义新的行为,可以在不更改原有类的基础上扩展它们的功能。
使用场景
-
复用现有类:
- 在代码中复用与新系统接口不兼容的现有类时,可以使用适配器模式进行调和。
-
接口转换:
- 新开发的系统中需要对现有组件进行接口封装,使其符合新接口时。
-
不兼容的系统交互:
- 不同供应商之间开发的模块或系统默认不兼容时,利用适配器模式可以帮助实现接口之间的兼容性。
适配器模式是一种常用于解决接口不匹配问题的设计策略,通过适配器对象的引入,使分离的系统能够优雅地协同工作,不仅提升了代码的复用性,也加强了系统的弹性与可维护性。
适配器模式详解
1027

被折叠的 条评论
为什么被折叠?



