【设计模式】桥接模式

桥接模式(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);

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

相关推荐
数据知道2 小时前
Go基础:文件与文件夹操作详解
开发语言·后端·golang·go语言
珍宝商店2 小时前
原生 JavaScript 方法实战指南
开发语言·前端·javascript
神龙斗士2403 小时前
Java 数组的定义与使用
java·开发语言·数据结构·算法
白露与泡影3 小时前
2025互联网大厂高频Java面试真题解析
java·开发语言·面试
gopyer3 小时前
180课时吃透Go语言游戏后端开发2:Go语言中的变量
开发语言·游戏·golang·游戏后端开发
月月吃喝3 小时前
【PyQt5】嵌套多线程数据交互实现
开发语言·qt·交互
匿名4593 小时前
Lombok注解使用无效的情况(未能获得后端数据)
java·开发语言
徐子童3 小时前
JVM高频面试题---GC垃圾回收
java·开发语言·jvm·面试题·gc·垃圾回收算法
AutomanLV3 小时前
c# datagridview添加list内容
程序人生·c#