介绍桥接设计模式
桥接设计模式是结构型设计模式之一,旨在将抽象部分与其实现部分分离,使它们都可以独立地变化。这种模式通过组合而不是继承来解耦抽象类和实现类,从而提高系统的灵活性和可扩展性。桥接模式可用于需要跨多个维度变化的系统,比如你需要支持多个平台和多个功能。
桥接设计模式的结构
在C++中,桥接设计模式通常由以下部分组成:
抽象类(Abstraction)
这是一个高层抽象类,包含一个指向实现(Implementor)类的指针。
细化抽象类(Refined Abstraction)
这是从抽象类继承而来的具体类,扩展了抽象类定义的接口,并且可以添加更多的方法。
实现类接口(Implementor)
这是一个接口或抽象类,定义了具体实现需要提供的操作方法。
具体实现类(Concrete Implementor)
这个类实现了实现类接口规定的具体方法。
桥接设计模式的示例
下面我们将用一个简单的示例来实现桥接设计模式。假设我们要实现一个图形应用程序,其中图形(比如圆和方形)可以用不同的绘制方式(比如用线条或者用填充)来呈现。
实现步骤
首先,定义实现类接口和具体实现类。
#include <iostream>
// Implementor
class DrawingAPI {
public:
virtual void drawCircle(double x, double y, double radius) = 0;
virtual ~DrawingAPI() = default;
};
// Concrete Implementor 1
class DrawingAPI1 : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) override {
std::cout << "API1.circle at " << x << ':' << y << ' ' << radius << std::endl;
}
};
// Concrete Implementor 2
class DrawingAPI2 : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) override {
std::cout << "API2.circle at " << x << ':' << y << ' ' << radius << std::endl;
}
};
接下来,定义抽象类和具体抽象类。
// Abstraction
class Shape {
public:
virtual void draw() = 0;
virtual void resizeByPercentage(double pct) = 0;
virtual ~Shape() = default;
protected:
Shape(DrawingAPI& drawingAPI) : drawingAPI(drawingAPI) {}
DrawingAPI& drawingAPI;
};
// Refined Abstraction
class CircleShape : public Shape {
public:
CircleShape(double x, double y, double radius, DrawingAPI& drawingAPI)
: Shape(drawingAPI), x(x), y(y), radius(radius) {}
void draw() override {
drawingAPI.drawCircle(x, y, radius);
}
void resizeByPercentage(double pct) override {
radius *= (1 + pct / 100.0);
}
private:
double x, y, radius;
};
最后,使用桥接模式创建实际对象并测试其功能。
int main() {
DrawingAPI1 api1;
DrawingAPI2 api2;
CircleShape circle1(1, 2, 3, api1);
CircleShape circle2(5, 7, 11, api2);
circle1.draw();
circle2.draw();
circle1.resizeByPercentage(50);
circle2.resizeByPercentage(100);
circle1.draw();
circle2.draw();
return 0;
}
总结
在设计模式中,桥接模式为我们提供了一个灵活的方法来解耦抽象部分和实现部分,从而可以独立变化。这种模式特别适用于跨多个维度变化的系统,如多个平台和多个功能。在C++中,通过明确抽象类和实现类的接口和继承关系,可以轻松实现桥接模式。
希望通过本篇文章,你能更加深入地理解桥接设计模式,并能在实际开发中灵活运用。