【设计模式】桥接模式

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

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

相关推荐
We་ct3 分钟前
LeetCode 50. Pow(x, n):从暴力法到快速幂的优化之路
开发语言·前端·javascript·算法·leetcode·typescript·
阿里嘎多学长6 分钟前
2026-04-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
EnCi Zheng7 分钟前
P2G-Python字符串方法完全指南-split、join、strip、replace的Python编程利器
开发语言·python
爱学习的小囧9 分钟前
VCF 9 实验室网络部署全攻略:从硬件连接到配置实操
开发语言·网络·php
liliangcsdn20 分钟前
LLM如何与mcp server交互示例
linux·开发语言·python
军军君0126 分钟前
Three.js基础功能学习十五:智能黑板实现实例二
开发语言·前端·javascript·vue.js·3d·threejs·三维
维齐洛波奇特利(male)29 分钟前
@Pointcut(“execution(* com.hdzx..*(..))“)切入点与aop 导致无限循环
java·开发语言
来日可期131439 分钟前
C/C++ 反常识记录(1)—— 那些容易踩坑的语法细节
c语言·开发语言·c++
实心儿儿1 小时前
C++ —— C++11(2)
开发语言·c++
立莹Sir1 小时前
云原生全解析:从概念到实践,Java技术栈如何拥抱云原生时代
java·开发语言·云原生