C# 设计模式(结构型模式):桥接模式

C# 设计模式(结构型模式):桥接模式

在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型设计模式,它通过将抽象部分与实现部分分离,使得两者可以独立变化,避免了它们之间的耦合。

1. 桥接模式的定义

桥接模式的核心思想是“将抽象与实现分离”,从而使得抽象部分和实现部分能够独立变化。通常,抽象部分可以是接口或抽象类,而实现部分则是具体的实现类。桥接模式允许它们之间通过桥梁类(Bridge)来进行交互。

2. 桥接模式的结构

桥接模式的结构通常包括以下几个部分:

  • Abstraction(抽象类):定义了高层业务逻辑,通常包含一个指向实现部分的引用。
  • RefinedAbstraction(精化抽象类):是 Abstraction 的具体实现,它可以扩展或重写抽象类中的方法。
  • Implementor(实现类接口):定义了实现的接口,通常包含一些基础的操作。
  • ConcreteImplementor(具体实现类):是 Implementor 接口的具体实现,提供实际的功能。
3. 桥接模式的应用场景

桥接模式适用于以下几种场景:

  • 当一个类有多个变化维度,而且这些变化维度需要独立扩展时。
  • 当类的继承层次会导致系统复杂化,使用桥接模式可以避免继承的“爆炸式”增长。
  • 当需要在运行时切换抽象部分和实现部分时。
4. C# 实现桥接模式

假设我们要设计一个图形绘制的系统。我们有不同的图形(比如圆形和矩形),而每个图形又可以在不同的操作系统(比如 Windows 和 Linux)上绘制。我们希望能够分别扩展图形和操作系统,而不增加类的数量。此时,桥接模式就可以派上用场。

// 实现类接口
public interface IDrawingAPI
{void DrawCircle(double x, double y, double radius);
}// 具体实现类:Windows 绘图
public class WindowsAPI : IDrawingAPI
{public void DrawCircle(double x, double y, double radius){Console.WriteLine($"Windows: Drawing Circle at ({x}, {y}) with radius {radius}");}
}// 具体实现类:Linux 绘图
public class LinuxAPI : IDrawingAPI
{public void DrawCircle(double x, double y, double radius){Console.WriteLine($"Linux: Drawing Circle at ({x}, {y}) with radius {radius}");}
}// 抽象类
public abstract class Shape
{protected IDrawingAPI drawingAPI;protected Shape(IDrawingAPI drawingAPI){this.drawingAPI = drawingAPI;}public abstract void Draw(); // 抽象方法
}// 精化抽象类:圆形
public class Circle : Shape
{private double x, y, radius;public Circle(double x, double y, double radius, IDrawingAPI drawingAPI) : base(drawingAPI){this.x = x;this.y = y;this.radius = radius;}public override void Draw(){drawingAPI.DrawCircle(x, y, radius);}
}// 客户端代码
class Program
{static void Main(string[] args){// 使用 Windows 绘图Shape circle1 = new Circle(10, 20, 5, new WindowsAPI());circle1.Draw();// 使用 Linux 绘图Shape circle2 = new Circle(30, 40, 10, new LinuxAPI());circle2.Draw();}
}

在这个例子中:

  • IDrawingAPI 是实现类接口,定义了如何绘制一个圆形。
  • WindowsAPILinuxAPI 是具体的实现类,提供了不同操作系统下绘制圆形的具体实现。
  • Shape 是抽象类,它依赖于 IDrawingAPI 来完成具体的绘图操作。
  • Circle 是精化的抽象类,表示具体的图形对象,通过 drawingAPI 调用不同的绘图实现。

通过桥接模式,我们成功地将图形(抽象)和绘图API(实现)分离开来,允许它们独立扩展。无论是添加新的图形类型(如矩形)还是新的操作系统支持,我们都可以在不修改现有代码的情况下进行扩展。

5. 桥接模式的优缺点

优点

  • 独立变化:抽象部分和实现部分可以独立扩展,减少了类的继承层次。
  • 提高灵活性:通过桥接模式,可以轻松地增加新的操作系统或图形类型,而不需要修改原有的代码。
  • 解耦:桥接模式解耦了抽象和实现,降低了它们之间的耦合性。

缺点

  • 增加类的数量:由于引入了桥接类,可能会导致系统类的数量增加。
  • 设计复杂性:在某些情况下,桥接模式的设计可能会使得系统结构变得复杂。
6. 总结

桥接模式是一个非常强大的设计模式,尤其适用于需要在多个维度扩展的系统。它通过将抽象部分与实现部分分离,使得它们可以独立变化,从而增加了系统的灵活性和可维护性。掌握桥接模式,可以帮助开发者设计出更加灵活、可扩展的系统。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一种针对 Transformer 模型中注意力机制的优化实现,旨在提高计算效率和内存利用率。随着大模型的普及,Flash Attention V3 在 H100 GPU 上实现了显著的性能提升,相比于前一版本,V3 通…

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

【网络】ARP表、MAC表、路由表

ARP表 网络设备存储IP-MAC映射关系的表项&#xff0c;便于快速查找和转发数据包 ARP协议工作原理 ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;地址解析协议&#xff0c;能够将网络层的IP地址解析为数据链路层的MAC地址。 1.主机在自己的ARP缓冲区中建…

Ubuntu22.04双系统安装记录

1.Ubuntu24.04在手动分区时&#xff0c;没有efi选项&#xff0c;需要点击分区界面左下角&#xff0c;选择efi的位置&#xff0c;然后会自动创建/boot/efi分区&#xff0c;改到2GB大小即可。 2.更新Nvidia驱动后&#xff0c;重启电脑wifi消失&#xff0c;参考二选一&#xff1a…

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理环境&#xff0c;不需要科学上网(价格便宜、有安全风险&#…

【Python其他生成随机字符串的方法】

在Python中&#xff0c;除了之前提到的方法外&#xff0c;确实还存在其他几种生成随机字符串的途径。以下是对这些方法的详细归纳&#xff1a; 方法一&#xff1a;使用random.randint结合ASCII码生成 你可以利用random.randint函数生成指定范围内的随机整数&#xff0c;这些整…

leetcode hot 100 跳跃游戏

55. 跳跃游戏 已解答 中等 相关标签 相关企业 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

01.02周二F34-Day44打卡

文章目录 1. 这家医院的大夫和护士对病人都很耐心。2. 她正跟一位戴金边眼镜的男士说话。3. 那个人是个圆脸。4. 那个就是传说中的鬼屋。5. 他是个很好共事的人。6. 我需要一杯提神的咖啡。7. 把那个卷尺递给我一下。 ( “卷尺” 很复杂吗?)8. 他收到了她将乘飞机来的消息。9.…

Spring Boot项目中使用单一动态SQL方法可能带来的问题

1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句&#xff0c;由于每次构建的SQL字符串可能不同&#xff0c;这会导致查询计划无法被有效利用&#xff0c;从而需要重新解析、优化和编译&#xff0c;…

【Rust自学】10.2. 泛型

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#xf…

Spark-Streaming有状态计算

一、上下文 《Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量&#xff0c;那么如何才能统计从开始加载数据到当下的所有数量呢&#xff1f;下面我们就来通过官方例子学习下Spark-Streaming有状态计算。 二、官方例子 所属包&#xff1a;org.…

Python 3 输入与输出指南

文章目录 1. 输入与 input()示例&#xff1a;提示&#xff1a; 2. 输出与 print()基本用法&#xff1a;格式化输出&#xff1a;使用 f-string&#xff08;推荐&#xff09;&#xff1a;使用 str.format()&#xff1a;使用占位符&#xff1a; print() 的关键参数&#xff1a; 3.…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奋斗&#xff01; Less-1 尝试添加’注入&#xff0c;发现报错 这里我们就可以直接发现报错的地方&#xff0c;直接将后面注释&#xff0c;然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

Swift Combine 学习(四):操作符 Operator

Swift Combine 学习&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 学习&#xff08;二&#xff09;&#xff1a;发布者 PublisherSwift Combine 学习&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 学习&#xff08;四&…

时间序列预测算法---LSTM

目录 一、前言1.1、深度学习时间序列一般是几维数据&#xff1f;每个维度的名字是什么&#xff1f;通常代表什么含义&#xff1f;1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路&#xff1f;1.4、RNN存在哪些问题? 二、…

leetcode题目(3)

目录 1.加一 2.二进制求和 3.x的平方根 4.爬楼梯 5.颜色分类 6.二叉树的中序遍历 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

快速上手LangChain(三)构建检索增强生成(RAG)应用

文章目录 快速上手LangChain(三)构建检索增强生成(RAG)应用概述索引阿里嵌入模型 Embedding检索和生成RAG应用(demo:根据我的博客主页,分析一下我的技术栈)快速上手LangChain(三)构建检索增强生成(RAG)应用 langchain官方文档:https://python.langchain.ac.cn/do…

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…

【Windows】powershell 设置执行策略(Execution Policy)禁止了脚本的运行

报错信息&#xff1a; 无法加载文件 C:\Users\11726\Documents\WindowsPowerShell\profile.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参 阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符…