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

news/2025/2/23 6:06:43

程序设计中的主要设计模式通常分为三大类,共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.niftyadmin.cn/n/5863070.html

相关文章

近地面无人机遥感:如何利用高光谱数据反演植被生理参数?

文章目录 前言专题一、近十年近地面无人机植被遥感文献分析、传感器选择、观测方式及质量控制要点1.1. 近十余年无人机植被遥感文献分析1.2. 无人机遥感的特点及与卫星遥感的差异1.3. 无人机传感器类型、特点及选择1.4. 无人机遥感观测方式、特点与质量控制 二、辐射度量与地物…

buu-ciscn_2019_n_5-好久不见41

由于目标程序的 BSS 段(包含 name 变量)权限是全开的(可读、可写、可执行),并且没有启用 NX(No Execute,非执行)保护机制,因此可以直接在 BSS 段上构造 Shellcode&#x…

Eclipse2024中文汉化教程(图文版)

对应Eclipse,部分人需要中文汉化,本章教程,介绍如何对Eclipse进行汉化的具体步骤。 一、汉化前的Eclipse 默认安装Eclipse的时候,默认一般都是English的,我当前版本是使用的是2024-06版本的Eclipse。 二、汉化详细步骤 点击上方菜单选项卡,Hep——Install New Software……

ARM Linux下FFmpeg+Nginx+RTMP 视频监控

一、流媒体协议 RTSP(Real-Time Stream Protocol)由 Real Networks 和 Netscape 共同提出的,基于文本的多媒体播放 控制协议。RTSP 定义流格式,流数据经由 RTP 传输;RTSP 实时效果非常好,适合视频聊天&…

vue中将el-table导出为excel文件

在 Vue Element UI 中,el-table 数据导出 Excel 文件,可以使用 xlsx(SheetJS)库进行处理。以下是详细的实现方法,包括安装依赖、代码示例和优化建议。 1. 安装依赖 首先,安装 xlsx 库: 复制…

宝塔扩容——阿里云如何操作

一、创建快照 磁盘快照,将数据备份,防止丢失。 1.登录“阿里云”账号 2.点击“控制台”——“云服务器 ECS” 3.点击“基本信息”下,右下角“系统盘” 4.点击“创建快照” 二、磁盘扩容 1.点击“云盘扩容” 2. 选择自己要扩容的大小 …

代码笔记插件

idea代码笔记插件 AnNote是一款代码笔记插件,支持多种语言,支持代码高亮,支持代码自动补全,支持搜索、支持附件,支持markdown格式文件 AnNote - IntelliJ IDEs Plugin | Marketplace 75折折扣: MGRYF-TJ…

在WPS中设置word的页码不从第一页开始,从指定页开始插入页码

大家好,我是小鱼。 在日常的办公中为Word文档页面插入页码是经常要做的。如果一个文档有几十页,插入页码不仅可以快速定位到文章的内容,如果需要制作目录也方便制作。正确情况下插入页码都是从第一页开始的,但是有些文档比如说标…