【设计模式】桥接模式

桥接模式(Bridge Pattern)

概念:

· 将抽象部分与实现部分分离,使它们可以独立地变化;

· 用"桥"连接抽象和实现部分;

UML结构:

复制代码
      Abstraction--------------------Implementor
          |                               |
  -------------------             -------------------
  |                 |             |                 |
RefinedAbstraction  ...       ConcreteImplementorA  ConcreteImplementorB

代码示例:

cs 复制代码
/// <summary>
/// 形状抽象类
/// </summary>
public abstract class Shape
{
    public string ShapeName { get; private set; }
    public Renderer Renderer { get; set; }

    public Shape(string shapeName, Renderer renderer)
    {
        this.ShapeName = shapeName;
        this.Renderer = renderer;
    }

    // 创建一个形状
    public virtual void Draw()
    {
        Renderer.Render(this);
    }
}

/// <summary>
/// 圆形(形状抽象类的具体实现)
/// </summary>
public class Circle : Shape
{
    public Circle(string shapeName, Renderer renderer) : base(shapeName, renderer) { }
}

/// <summary>
/// 矩形(形状抽象类的具体实现)
/// </summary>
public class Rectangle : Shape
{
    public Rectangle(string shapeName, Renderer renderer) : base(shapeName, renderer) { }
}

/// <summary>
/// 渲染平台抽象类
/// </summary>
public abstract class Renderer
{
    // 渲染一个图形
    public abstract void Render(Shape shape);
}

/// <summary>
/// OpenGL渲染类(渲染抽象类的具体的实现)
/// </summary>
public class OpenGL : Renderer
{
    // 渲染一个图形?
    public override void Render(Shape shape)
    {
        Console.WriteLine($"使用OpenGL渲染引擎渲染图形:{shape.ShapeName}");
    }
}
/// <summary>
/// DirectX渲染类(渲染抽象类的具体的实现)
/// </summary>
public class DirectX : Renderer
{
    // 渲染一个图形
    public override void Render(Shape shape)
    {
        Console.WriteLine($"使用DirectX渲染引擎渲染图形:{shape.ShapeName}");
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        Renderer openGL = new OpenGL();
        Renderer directX = new DirectX();
        Shape circle = new Circle("Circle", openGL);
        Shape rectangle = new Rectangle("Rectangle", directX);
        circle.Draw();
        rectangle.Draw();

        circle.Renderer = directX;
        rectangle.Renderer = openGL;
        circle.Draw();
        rectangle.Draw();
    }
}

特点:
优点:

· 抽象与实现分离 :修改实现不会影响抽象,反之亦然;

· 提高可扩展性 :可以在不改变抽象的情况下增加新的实现;

· 避免类爆炸 :不必为每种组合都创建子类;
缺点:

· 增加系统复杂性 :类的层次变多,结构相对复杂;

· 理解成本高 :需要理解桥接与组合关系,组合 (Composition)是桥接模式的实现手段;

适用场景:

· 抽象和实现可能独立扩展;

· 不希望在抽象类中固定具体实现;

· 系统中有多维度变化,需要避免类爆炸;

举例场景:

· 图形绘制系统

· 抽象:图形(Shape)

· 扩展抽象:圆形、矩形

· 实现接口:绘图 API(OpenGL、DirectX)

· 具体实现:不同绘图 API 绘制方式

· 跨平台窗口系统

· 抽象:窗口(Window);

· 扩展抽象:对话框窗口、警告窗口;

· 实现接口:操作系统接口(Windows API、Linux API);

· 具体实现:不同操作系统的窗口绘制方法;

相关推荐
深蓝电商API1 分钟前
异步爬虫中代理池的并发管理
开发语言·爬虫·python
hhy_smile1 分钟前
Special method in class
java·开发语言
沐知全栈开发5 分钟前
Bootstrap5 轮播
开发语言
༾冬瓜大侠༿10 分钟前
C++string
c语言·开发语言·c++·算法
雨季66611 分钟前
Flutter 三端应用实战:OpenHarmony “极简文本字符计数器”——量化表达的尺度
开发语言·flutter·ui·交互·dart
skywalker_1114 分钟前
多线程&JUC
java·开发语言·jvm·线程池
黎雁·泠崖15 分钟前
Java基础核心能力总结:从语法到API的完整知识体系
java·开发语言
雨季66622 分钟前
Flutter 三端应用实战:OpenHarmony “呼吸灯”——在焦虑时代守护每一次呼吸的数字禅修
开发语言·前端·flutter·ui·交互
初恋叫萱萱1 小时前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
cyforkk2 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试