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

embedded/2025/2/25 3:06:34/

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

相关文章

设计模式相关知识点

目录 设计模式 设计模式 代码设计原则 设计模式 设计模式 干掉if...else,最好用的3种设计模式! | 小傅哥 bugstack 虫洞栈 代码设计原则-CSDN博客 23种设计模式-CSDN博客 策略模式(Strategy Pattern)-CSDN博客 责任链模式…

C从入门到放弃篇1

各位新入坑C语言的朋友,你们有福了因为你们遇到了我,我会带你放弃C语言,哈哈哈哈哈。 其实,学任何东西都是循序渐进的,在学习的初期投入更多的精力,将来你会越学越快。我相信,放弃是最容易的事…

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载: 情况一:如果谷歌应用商店可以打开,那么就直接到谷歌应用商店下载,直接搜索vue.js.devtools添加扩展即可。 情况二:谷歌浏览器的谷歌应用商城打不开,那么就百度搜索极简插件找到vue.js.…

50周学习go语言:第2周 基础语法与温度转换程序

以下是第二周Go语言基础语法的详细教程,包含变量声明、基本类型操作和温度转换任务的完整实现指南: 第二周:基础语法与温度转换程序 一、变量声明 1. var关键字声明 // 标准声明格式(类型在变量名后) var 变量名 类型…

Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

python网络安全怎么学 python做网络安全

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 众所周知,python是近几年比较火的语言之一,它具有简单易懂、免费开源、可移植、可扩展、丰富的第三方库函数等特点,Java需要大…

sysaux表空间处理流程

1.查看节点1表空间情况 set line 200; set pagesize 20000; set feedback off; col tablespace_name for a20; col c_free_percent for a12; col c_used_percent for a12; col m_free_percent for a12; col m_USED_PERCENT for a12; select d.tablespace_name,round(d…

数仓搭建(hive):DWS层(服务数据层)

DWS层示例: 搭建日主题宽表 需求 维度 步骤 在hive中建数据库dws >>建表 CREATE DATABASE if NOT EXISTS DWS; 建表sql CREATE TABLE yp_dws.dws_sale_daycount( --维度 city_id string COMMENT 城市id, city_name string COMMENT 城市name, trade_area_id string COMME…