桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们可以独立地变化。通过这种方式,桥接模式减少了抽象和实现之间的依赖,提供了更高的灵活性和扩展性。

假设我们有一个图形框架,它需要支持不同的操作系统(如Windows、Mac)和不同的图形类型(如圆形、方形)。我们可以使用桥接模式来分别处理图形类型的抽象和平台特定的实现。
在一个UI框架中,UI组件的抽象(如按钮、文本框)需要在不同平台(如Android、iOS)上进行实现。桥接模式可以通过将UI组件的功能和具体平台的实现分离,提供良好的扩展性和平台适应性。
#include <iostream>
using namespace std;
// 实现接口
class DrawingAPI {
public:
virtual void drawCircle(double x, double y, double radius) const = 0;
virtual ~DrawingAPI() = default;
};
// 具体实现:Windows
class WindowsAPI : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) const override {
cout << "Drawing circle on Windows at (" << x << ", " << y << ") with radius " << radius << endl;
}
};
// 具体实现:Mac
class MacAPI : public DrawingAPI {
public:
void drawCircle(double x, double y, double radius) const override {
cout << "Drawing circle on Mac at (" << x << ", " << y << ") with radius " << radius << endl;
}
};
// 抽象类
class Shape {
protected:
DrawingAPI* drawingAPI; // 通过组合来关联具体实现
public:
Shape(DrawingAPI* api) : drawingAPI(api) {}
virtual void draw() const = 0;
virtual void resize(double factor) = 0;
virtual ~Shape() = default;
};
// 具体抽象类:圆形
class Circle : public Shape {
private:
double x, y, radius;
public:
Circle(double x, double y, double radius, DrawingAPI* api) : Shape(api), x(x), y(y), radius(radius) {}
void draw() const override {
drawingAPI->drawCircle(x, y, radius);
}
void resize(double factor) override {
radius *= factor;
}
};
// 客户端代码
int main() {
WindowsAPI windowsAPI;
MacAPI macAPI;
Circle circle1(5, 5, 10, &windowsAPI);
Circle circle2(10, 10, 20, &macAPI);
circle1.draw(); // 通过WindowsAPI绘制
circle2.draw(); // 通过MacAPI绘制
return 0;
}using System;
// 实现接口
public interface IDrawingAPI {
void DrawCircle(double x, double y, double radius);
}
// 具体实现:Windows
public class WindowsAPI : IDrawingAPI {
public void DrawCircle(double x, double y, double radius) {
Console.WriteLine($"Drawing circle on Windows at ({x}, {y}) with radius {radius}");
}
}
// 具体实现:Mac
public class MacAPI : IDrawingAPI {
public void DrawCircle(double x, double y, double radius) {
Console.WriteLine($"Drawing circle on Mac at ({x}, {y}) with radius {radius}");
}
}
// 抽象类
public abstract class Shape {
protected IDrawingAPI drawingAPI;
protected Shape(IDrawingAPI api) {
drawingAPI = api;
}
public abstract void Draw();
public abstract void Resize(double factor);
}
// 具体抽象类:圆形
public class Circle : Shape {
private double x, y, radius;
public Circle(double x, double y, double radius, IDrawingAPI api) : base(api) {
this.x = x;
this.y = y;
this.radius = radius;
}
public override void Draw() {
drawingAPI.DrawCircle(x, y, radius);
}
public override void Resize(double factor) {
radius *= factor;
}
}
// 客户端代码
class Program {
static void Main() {
IDrawingAPI windowsAPI = new WindowsAPI();
IDrawingAPI macAPI = new MacAPI();
Shape circle1 = new Circle(5, 5, 10, windowsAPI);
Shape circle2 = new Circle(10, 10, 20, macAPI);
circle1.Draw(); // 通过WindowsAPI绘制
circle2.Draw(); // 通过MacAPI绘制
}
}通过这种方式,桥接模式实现了“将变化的部分与不变的部分分开”的设计理念,提高了系统的可维护性和可扩展性。
欢迎关注、点赞、收藏!更多系列内容可以点击专栏目录订阅,感谢支持,再次祝大家祉猷并茂,顺遂无虞!
若将文章用作它处,请一定注明出处,商用请私信联系我!