C# 桥接模式
栏目总目录
概念
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与具体实现部分分离,使它们可以独立地变化。这种设计模式通过创建一个连接(桥)来将抽象和实现部分分离,从而允许它们独立地进行扩展和变化。桥接模式的主要目标是解耦抽象部分(如类或对象)和实现部分(如具体类或对象),使得它们可以分别进行扩展或修改,而不会相互影响。
角色定义
桥接模式主要包含以下四个角色:
- 抽象化(Abstraction)角色:定义抽象类的接口,并维护一个指向实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
好处
- 分离抽象接口与实现部分:使得抽象接口和实现部分可以独立变化,提高了系统的可扩展性。
- 符合开闭原则:对扩展开放,对修改关闭,降低了系统的维护成本。
- 符合合成复用原则:提高了代码的复用性,减少了代码冗余。
- 实现细节对客户透明:客户只需关心抽象接口,无需了解具体实现细节。
应用场景
- 需要在构件的抽象化角色和具体化角色之间增加更多的灵活性:通过桥接模式,可以在抽象层建立一个关联关系,避免在两个层次之间建立静态的继承联系。
- 不希望使用继承或因为多层次继承导致系统类的个数急剧增加:桥接模式可以取代多层继承方案,减少子类的数量。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展:使用桥接模式可以分别对这些维度进行扩展,而不会影响其他部分。
示例代码
using System;// 实现化角色接口
namespace BridgePatternDemo
{public interface IDrawAPI{void DrawCircle(int radius, int x, int y);}// 具体实现化角色1public class RedCircle : IDrawAPI{public void DrawCircle(int radius, int x, int y){Console.WriteLine($"Drawing Circle[color: red, radius: {radius}, x: {x}, y: {y}]");}}// 具体实现化角色2public class GreenCircle : IDrawAPI{public void DrawCircle(int radius, int x, int y){Console.WriteLine($"Drawing Circle[color: green, radius: {radius}, x: {x}, y: {y}]");}}// 抽象化角色public abstract class Shape{protected IDrawAPI drawAPI;protected Shape(IDrawAPI drawAPI){this.drawAPI = drawAPI;}public abstract void Draw();}// 扩展抽象化角色public class Circle : Shape{private int x, y, radius;public Circle(int x, int y, int radius, IDrawAPI drawAPI) : base(drawAPI){this.x = x;this.y = y;this.radius = radius;}public override void Draw(){drawAPI.DrawCircle(radius, x, y);}}
}// 客户端代码
class Program
{static void Main(string[] args){// 创建具体实现化对象IDrawAPI redCircleAPI = new RedCircle();IDrawAPI greenCircleAPI = new GreenCircle();// 创建扩展抽象化对象,并注入具体实现化对象Shape redCircle = new Circle(100, 100, 10, redCircleAPI);Shape greenCircle = new Circle(100, 100, 10, greenCircleAPI);// 调用方法,展示结果redCircle.Draw();greenCircle.Draw();Console.ReadLine();}
}
在这个示例中,IDrawAPI 接口及其两个具体实现 RedCircle 和 GreenCircle 构成了实现化角色的部分。Shape 抽象类和 Circle 类则构成了抽象化角色和扩展抽象化角色的部分。客户端代码(位于 Program 类中)展示了如何使用这些角色来创建和绘制不同颜色的圆形。
通过桥接模式,我们可以轻松地在不修改 Circle 类或 Shape 抽象类的情况下,添加新的颜色或绘制方法,只需实现新的 IDrawAPI 接口即可。这增加了系统的灵活性和可扩展性。
六、总结
桥接模式通过将抽象部分与实现部分分离,提高了系统的灵活性和可扩展性。在实际开发中,当遇到需要在两个独立变化的维度上进行扩展时,可以考虑使用桥接模式。希望本文能帮助你更好地理解和应用C#中的桥接模式。
相关文章:
C# 桥接模式
栏目总目录 概念 桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与具体实现部分分离,使它们可以独立地变化。这种设计模式通过创建一个连接(桥)来将抽象和实现部分分离,从而允许…...
GPT-4o mini一手测评:懂得不多,但答得极快
在性能方面,GPT-4o mini 在 MMLU 上的得分为 82%,在 LMSYS 排行榜的聊天方面分数优于 GPT-4。 OpenAI 突然上线新模型 GPT-4o mini, 声称要全面取代 GPT-3.5 Turbo。 在性能方面,GPT-4o mini 在 MMLU 上的得分为 82%,在 LMSYS 排行榜的聊天方面分数优于 GPT-4。 在价格…...
Python面试题:结合Python技术,如何使用Pytest进行单元测试和集成测试
使用Pytest进行单元测试和集成测试是非常常见和有效的方法。下面是如何使用Pytest进行这些测试的详细指南。 安装Pytest 首先,使用pip安装Pytest: pip install pytest单元测试 单元测试用于测试单个模块或函数的功能。假设我们有一个简单的Python模块…...
Java面试必看!知己知彼才能百战百胜,如何做好面试前的准备?
随着 Java 这个赛道的不断内卷,这两年,Java 程序员的面试,从原来的常规八股文(有 标准答案)到现在,以项目、场景问题、技术深度思考为主,逐步转变成没有标准答案, 需要大家基于自己的…...
[Vue warn]: data functions should return an object:
仔细检查你的代码肯定有一个data()内忘记方return{}了...
.net 7和core版 SignalR
.net 7和core版 SignalR代码示例(手把手一起认识Websocket、SignalR) # 白话讲解 刚听到Websocket、SignalR有没有很迷茫,一脸懵逼的那种有没有,都是通信,这俩有什么区别,都是怎么实现的,什么时候该用哪一个, 苦于Websocket、SignalR久已,今天必须整出个一二三来,…...
【人工智能】Transformers之Pipeline(三):文本转音频(text-to-audio/text-to-speech)
一、引言 pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理&#x…...
前端入门知识分享:HTML 页面中 head 标签之间的代码详解
前端入门知识分享:HTML 页面中 head 标签之间的代码详解 在HTML代码中HEAD之间的代码就是网页头元素,里面的内容不会显现在网页中,因此很容易被别人遗忘,但它对网页的渲染和功能性至关重要。如果能够掌握它的概念和使用方法&#…...
【Spring Boot】手撕搜索引擎项目,深度复盘在开发中的重难点和总结(长达两万6千字的干货,系好安全带,要发车了......)
目录 搜索引擎搜索引擎的核心思路 一、解析模块1.1 枚举所有文件1.2 解析每个文件的标题,URL以及正文1.2.1 解析标题1.2.2 解析URL1.2.3 解析正文 1.3 线程池优化代码 二 、创建排序模块2.1 构建正排索引2.2 构建倒排索引2.3 序列化2.4 反序列化 三、搜索模块3.1 引…...
测试面试宝典(四十二)—— 接口测试什么时候介入
回答一: 接口测试通常在项目开发的早期阶段就可以介入。一般来说,在接口定义和设计完成后,开发人员开始进行接口的初步实现时,测试人员就可以着手进行接口测试了。比如,在需求分析和评审阶段,明确了接口的功…...
【Elasticsearch】Elasticsearch的分片和副本机制
文章目录 📑前言一、分片(Shard)1.1 分片的定义1.2 分片的重要性1.3 分片的类型1.4 分片的分配 二、副本(Replica)2.1 副本的定义2.2 副本的重要性2.3 副本的分配 三、分片和副本的机制3.1 分片的创建和分配3.2 数据写…...
鸿蒙开发入门指南
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 引言 一、鸿蒙系统概述 1.1 简介 1.2 鸿蒙开发的优势 二、鸿蒙开发环境搭建 2.1 安装鸿蒙DevEco Studi…...
从分散到整合,细说比特币发展史
原文标题:《Layered Bitcoin》 撰文:Saurabh Deshpande 编译:Chris,Techub News 古往今来,货币在社会中都具有三个关键的功能:财富的储存手段、交换媒介和计量单位。虽然货币的形式在不断变化,…...
TreeSelect增加可筛选功能
TreeSelect官方可筛选示例 <template><el-tree-selectv-model"value":data"data"filterablestyle"width: 240px"/><el-divider /><el-divider />filter node method:<el-tree-selectv-model"value":data&q…...
星环科技与宁夏银行“大数据联合实验室”揭牌,持续打造金融科技新范式
5月30-31日,2024向星力未来数据技术峰会期间,在峰会现场来宾共同见证下,星环科技与宁夏银行“大数据联合实验室”正式揭牌,宁夏银行股份有限公司首席信息官崔彦刚与星环科技副总裁邱磊共同为联合实验室揭牌。 星环科技与宁夏银行借…...
React native页面突然白屏
背景:某个时间段突然收到破100的用户反馈,商品详情(React native页面)打不开,一片空白,无法正常使用 设备:部分华为手机Harmoney4.0,华为相关Android系统 可临时恢复方案ÿ…...
一段直接路径读取文件LINUX C代码
最近搞个MYBATIS-PLUS里面的MAPPER DAO方法审计.就是把里面的SQL提取出来,然后使用SQL质量工具进行审计! SQLE 在这方面功能强大,就是细节不够完美,它有SCANDR工具可以把某个目录下XML文件扫描并上传到SQLE里面进行审计. 通过自由裁剪的MYSQL 审核规则,一条条SQL进行! 问题是那…...
Android让所有APK横屏显示
在Android6.0.1里面,Box产品的HDMI输出都是以横屏显示,而有些APK会申请竖屏显示,此时通过修改frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java文件里面的updateRotationUncheckedLocked函数的如下语句&…...
【智能制造-26】PLC标准-SICAR
什么是SICAR? SICAR 是西门子基于 TIA Portal 的汽车行业自动化标准。 SICAR 标准具有以下特点和优势: 提供了统一的硬件和软件标准,以及统一的接口。涵盖了从 PLC 程序、HMI 画面到特定工艺功能块(如机器人、阀岛、视觉系统等&…...
浅学爬虫-处理复杂网页
在处理实际项目时,网页通常比示例页面复杂得多。我们需要应对分页、动态加载和模拟用户行为等问题。以下是一些常见的场景及其解决方案。 处理分页 许多网站将内容分成多个页面,称为分页。要抓取这些数据,需要编写一个能够遍历所有分页的爬…...
如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南
如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 你是否曾在密密麻麻的黄色文件夹中迷失方向?每天花费…...
FanControl风扇控制软件:从噪音困扰到静音享受的完整指南
FanControl风扇控制软件:从噪音困扰到静音享受的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...
给渗透新手的保姆级指南:用Kali和MSF搞定VulnHub经典靶机DC-1
Kali Linux渗透测试实战:从零攻破VulnHub DC-1靶机 环境准备与靶机配置 在开始渗透测试之前,确保你已经准备好以下工具和环境。Kali Linux作为渗透测试的标准发行版,集成了我们所需的所有工具。DC-1是Vulnhub上一个专为渗透测试练习设计的靶机…...
基于MATLAB的平移线扫激光三维重建完整方案与代码实现
现整理了一套完整的,平移线扫重建 matlab代码和方案,包含相机标定、光平面标定与方案、移动装置标定与方案、激光线条中心线自适应提取、畸变矫正、三维重建、点云滤波等部分,代码按模块编写,注释完整,附带一份完整苹果…...
小米智能家居集成终极指南:5分钟快速接入HomeAssistant
小米智能家居集成终极指南:5分钟快速接入HomeAssistant 【免费下载链接】hass-xiaomi-miot Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成 项目地址: https://…...
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案 【免费下载链接】fetch-github-hosts 🌏 同步github的hosts工具,支持多平台的图形化和命令行,内置客户端和服务端两种模式~ | Synchronize GitHub hosts tool, support m…...
如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享
如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享 在服务器运维和硬件性能评估中,内存和磁盘的稳定性直接关系到系统的可靠性。想象一下,当你的服务器在凌晨三点突然因为内存错误崩溃,或者磁盘在高峰期出现读写异常&a…...
【字节/阿里/微软Python高级岗内部题库】:GIL移除过渡期必须掌握的7种无锁并发模式
第一章:GIL移除背景与无锁并发演进全景图Python 的全局解释器锁(GIL)长期被视为多核 CPU 利用率的瓶颈,尤其在 CPU 密集型场景下,线程无法真正并行执行。近年来,CPython 社区启动了 GIL 移除(GI…...
AI 开发实战:AI 成本监控怎么做,团队才不会越用越贵
AI 开发实战:AI 成本监控怎么做,团队才不会越用越贵 一、这个问题为什么值得专门拿出来做? 在 AI 工程落地里,真正拖慢团队的往往不是模型本身,而是流程和协作方式没有跟上。 围绕“AI 成本监控怎么做,团…...
Cherry Studio终极模型集成指南:支持DeepSeek-R1等主流LLM的桌面AI神器
Cherry Studio终极模型集成指南:支持DeepSeek-R1等主流LLM的桌面AI神器 【免费下载链接】cherry-studio 🍒 Cherry Studio is a desktop client that supports for multiple LLM providers. Support deepseek-r1 项目地址: https://gitcode.com/GitHub…...
