当前位置: 首页 > article >正文

23种设计模式之《桥接模式(Bridge)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种:

1. 创建型模式(Creational Patterns)

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。

  • 工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。

  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

  • 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。

  • 原型模式(Prototype):通过复制现有对象来创建新对象。

2. 结构型模式(Structural Patterns)

  • 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。

  • 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。

  • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。

  • 装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。

  • 外观模式(Facade):为子系统中的一组接口提供一个统一的接口。

  • 享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。

  • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

3. 行为型模式(Behavioral Patterns)

  • 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。

  • 命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。

  • 解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。

  • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。

  • 中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。

  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

  • 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。

  • 状态模式(State):允许对象在其内部状态改变时改变其行为。

  • 策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。

  • 模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。

  • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

4.桥接模式(Bridge Pattern)解释

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。桥接模式通过组合的方式,将抽象和实现解耦,使得它们可以独立扩展,而不会相互影响。

桥接模式的核心思想是:

  • 抽象部分(Abstraction):定义高层的控制逻辑,通常包含对实现部分的引用。

  • 实现部分(Implementor):定义底层的操作接口,通常由具体的实现类来实现。

通过这种方式,桥接模式可以在不修改抽象部分的情况下,动态地替换实现部分,从而实现系统的灵活性和可扩展性。

5.桥接模式的C#演示代码

下面是一个简单的C#示例,展示了如何使用桥接模式来实现一个图形绘制系统。在这个系统中,抽象部分是图形(如圆形、矩形),而实现部分是绘制图形的API(如OpenGL、DirectX)。

csharp

using System;

// 实现部分接口
public interface IRenderer
{
    void RenderCircle(float radius);
    void RenderRectangle(float width, float height);
}

// 具体实现部分:OpenGL
public class OpenGLRenderer : IRenderer
{
    public void RenderCircle(float radius)
    {
        Console.WriteLine($"OpenGL: Drawing a circle with radius {radius}");
    }

    public void RenderRectangle(float width, float height)
    {
        Console.WriteLine($"OpenGL: Drawing a rectangle with width {width} and height {height}");
    }
}

// 具体实现部分:DirectX
public class DirectXRenderer : IRenderer
{
    public void RenderCircle(float radius)
    {
        Console.WriteLine($"DirectX: Drawing a circle with radius {radius}");
    }

    public void RenderRectangle(float width, float height)
    {
        Console.WriteLine($"DirectX: Drawing a rectangle with width {width} and height {height}");
    }
}

// 抽象部分:图形
public abstract class Shape
{
    protected IRenderer renderer;

    protected Shape(IRenderer renderer)
    {
        this.renderer = renderer;
    }

    public abstract void Draw();
}

// 具体抽象部分:圆形
public class Circle : Shape
{
    private float radius;

    public Circle(float radius, IRenderer renderer) : base(renderer)
    {
        this.radius = radius;
    }

    public override void Draw()
    {
        renderer.RenderCircle(radius);
    }
}

// 具体抽象部分:矩形
public class Rectangle : Shape
{
    private float width;
    private float height;

    public Rectangle(float width, float height, IRenderer renderer) : base(renderer)
    {
        this.width = width;
        this.height = height;
    }

    public override void Draw()
    {
        renderer.RenderRectangle(width, height);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        // 使用OpenGL渲染器绘制圆形
        IRenderer openGLRenderer = new OpenGLRenderer();
        Shape circle = new Circle(5.0f, openGLRenderer);
        circle.Draw();

        // 使用DirectX渲染器绘制矩形
        IRenderer directXRenderer = new DirectXRenderer();
        Shape rectangle = new Rectangle(10.0f, 20.0f, directXRenderer);
        rectangle.Draw();
    }
}

6.代码说明

  1. IRenderer接口:定义了绘制图形的接口,包括绘制圆形和矩形的方法。这是实现部分的接口。

  2. OpenGLRenderer和DirectXRenderer类:这两个类分别实现了IRenderer接口,提供了使用OpenGL和DirectX绘制图形的具体实现。

  3. Shape抽象类:这是抽象部分的基类,包含一个IRenderer的引用。它定义了一个抽象的Draw方法,具体的图形类需要实现这个方法。

  4. Circle和Rectangle类:这两个类继承自Shape,分别表示圆形和矩形。它们通过调用IRenderer接口的方法来实现具体的绘制逻辑。

  5. 客户端代码:在Main方法中,我们创建了不同的渲染器(OpenGL和DirectX),并使用它们来绘制不同的图形(圆形和矩形)。通过这种方式,我们可以轻松地切换不同的渲染器,而不需要修改图形类的代码。

7.总结

桥接模式通过将抽象部分与实现部分分离,使得它们可以独立变化。这种模式非常适合用于需要在运行时动态切换实现的情况,或者在系统中存在多个维度的变化时。通过桥接模式,我们可以提高代码的灵活性和可维护性。


http://www.kler.cn/a/558277.html

相关文章:

  • SpringBoot3使用RestTemplate请求接口忽略SSL证书
  • 蓝桥备赛(一)- C++入门(上)
  • Unity贴图与模型相关知识
  • PostgreSQL‘会用‘到‘精通‘,学习感悟
  • 《论云上自动化运维及其应用》审题技巧 - 系统架构设计师
  • [原创](Modern C++)现代C++的关键性概念: std::span, 低内存开销的方式来操作大数据.
  • C语言--正序、逆序输出为奇数的位。
  • Spring Boot:开启快速开发新时代
  • 23种设计模式之《组合模式(Composite)》在c#中的应用及理解
  • ETL工具: Kettle入门(示例从oracle到oracle的数据导入)
  • 51单片机学习——动态数码管显示
  • ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
  • SAP 代码扫描工具
  • 鹰角基于 Flink + Paimon + Trino 构建湖仓一体化平台实践项目
  • Linux离线环境安装miniconda并导入依赖包
  • Spring 依赖注入实战指南:XML、注解、Java 配置全面对比
  • 备忘录模式:快速恢复原始数据
  • 图数据库Neo4j面试内容整理-关系类型
  • Linux 性能更好的ftp客户端 lftp 使用详解
  • PHP Libxml:深入解析XML解析库及其在PHP中的应用