【设计模式】桥接模式

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

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

相关推荐
落日漫游11 小时前
数据结构笔试核心考点
java·开发语言·算法
寻找华年的锦瑟12 小时前
Qt-配置文件(INI/JSON/XML)
开发语言·qt
HY小海12 小时前
【C++】AVL树实现
开发语言·数据结构·c++
workflower12 小时前
Fundamentals of Architectural Styles and patterns
开发语言·算法·django·bug·结对编程
Roc-xb12 小时前
ModuleNotFoundError: No module named ‘conda_token‘
开发语言·python·conda
让我上个超影吧12 小时前
设计模式【工厂模式和策略模式】
java·设计模式·策略模式
人工干智能13 小时前
Python 开发中:`.ipynb`(Jupyter Notebook 文件)和 `.py`(Python 脚本文件)
开发语言·python·jupyter
Jay-juice13 小时前
QT信号与槽
开发语言·qt
fs哆哆13 小时前
在VB.NET中,有没有 ?.这个运算符
java·开发语言·.net
驰羽13 小时前
[GO]什么是热重载,如何使用Air工具
开发语言·后端·golang