【设计模式】桥接模式

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

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

相关推荐
mqiqe9 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
gugucoding9 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g10 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__10 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
依然鸣11 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
byxdaz11 小时前
QT中服务使用
开发语言·qt
库玛西13 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
caimouse13 小时前
ReactOS 图形系统分析(19):颜色转换对象 — XLATEOBJ(xlateobj.c/h)
c语言·开发语言
liulilittle13 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农13 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang