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.rhkb.cn/news/502196.html

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

相关文章

旧服务改造及微服务架构演进

旧服务改造及微服务架构演进 微服务架构演进1.微服务架构2.微服务架构的特点3.单体架构与微服务架构之间的对比4.微服务架构演进历程 旧服务改造1. 微服务拆分的一些通用原则2.微服务拆分策略(1)功能维度拆分策略(2)非功能维度拆分…

springmvc--请求参数的绑定

目录 一、创建项目,pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕。2. 应用程序/启动台显示Navicat图标,表示安装成功。 二、运行测试运行后提示:“Navicat Premium.pp”已损坏&#x…

Lombok @Data无法 import 导入的问题解决办法

问题原因:Maven Pom中依赖的Lombok版本与安装在eclipse根目录下的Lombok版本不一致 解决办法:找到Maven Pom依赖版本的Lombok Jar包,执行命令:java -jar lombok-1.18.36.jar,运行如下图,然后安装即可。这样…

对计网大题的一些指正(中间介绍一下CDM的原理和应用)

目录 前言: (1)五层原理体系结构每层功能: 下面是文档的答案: 我在之前的博客里面有介绍过五层原理体系结构, 按理来说,第五层应该是应用层才对,而会话层的功能应该被放到应用层…

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集,如RV32I表示支持32位整数指令集。I表示基本指令集,M表示整数乘法与除法指令集,A表示存储器原子指令集,F表示单精度浮点指令集,D表示双精度浮点指令集等,C…

SpringBoot入门之创建一个Hello World项目

文章目录 一、使用传统的方式1、创建一个SpringBoot项目2、配置pom.xml文件3、下载Maven依赖4、创建一个Controller类:com.devops.controller.HelloController5、创建一个引导类:com.devops.HelloApplication6、启动项目8、访问80809、完整项目结构 二、…

三、GIT与Github推送(上传)和克隆(下载)

GIT与Github推送(上传)和克隆(下载) 一、配置好SSH二、在Github创建仓库三、git克隆(下载)文件四、git推送(上传)文件到远程仓库 一、配置好SSH Git与Github上传和下载时需要使用到…

深入理解属性抽取:实体内部特征信息的挖掘

目录 前言1. 属性抽取的定义与任务1.1 属性抽取的定义1.2 属性抽取的主要任务 2. 属性抽取的技术方法2.1 基于规则的方法2.2 基于机器学习的方法常用模型特征设计 2.3 基于深度学习的方法常用模型架构优势与挑战 2.4 无监督与弱监督方法 3. 属性抽取面临的挑战与应对策略3.1 挑…

145页PPT智慧矿山整体规划建设方案

本资料收录在【智慧方案文库】知识星球(截止目前共9500份,PPTWORD超过7000份,持续上传中......) 68页PPT丨5G智能矿山解决方案 77页PPT智慧矿山整体规划建设方案

应用架构模式

设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…

以太网ICMP协议(ping指令)——FPGA学习笔记25

--素材来源原子哥 一、IP协议 1、IP简介 IP是Internet Protocol(网际互连协议)的缩写。IP 协议是 TCP/IP 协议簇中的核心协议,它为上层协议提供无状态、无连接、不可靠的服务。IP 协议规定了数据传输时的基本单元和格式 。 IP协议是 OSI 参考模型中网络层…

XIAO ESP32 S3网络摄像头——2视频获取

本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…

数据看板如何提升决策效率?

数据看板作为一种直观、高效的数据可视化工具,在这一过程中发挥着至关重要的作用。以一家中型制造企业为例,每天面临着生产计划的安排、原材料的采购、产品质量的把控以及市场销售的策略制定等诸多业务场景。在生产线上,需要确保设备的高效运…

javaEE-文件操作和IO-文件

目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备: 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式: 6.文件的分类 二、java中文件系统的操作 1.File类中的属性: 2.构造方…

【网络安全 | 漏洞挖掘】JS Review + GraphQL滥用实现管理面板访问

未经许可,不得转载。 正文 在映射目标范围后,我发现了一个用于管理的控制台界面,但没有注册功能。 于是我开始尝试: 1、模糊测试注册端点 -> 失败 2、在请求中将登录替换为注册 -> 再次失败 尝试均未奏效后,我决定冷静下来,重新思考方法并利用技术手段。 我观察…

【使用命令配置java环境变量永久生效与脚本切换jdk版本】

java配置环境变量命令与脚本切换jdk版本 新建用户环境变量永久生效 setx JAVA8_HOME "D:\Java\jdk8" setx JAVA17_HOME "d:\Java\jdk-17" setx JAVA_HOME %JAVA8_HOME% setx CLASSPATH ".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;"…

RabbitMq的Java项目实践

在现代软件开发中,消息队列(Message Queue,简称MQ)作为一种重要的组件,承担着上下游消息传递和通信的重任。RabbitMQ作为一款流行的开源消息队列中间件,凭借其高可用性、可扩展性和易用性等特点&#xff0c…

《代码随想录》Day25打卡!

《代码随想录》回溯算法:递增子序列 本题的完整题目如下: 本题的完整思路如下: 1.本题使用递归和回溯来求解,所以分为三部: 2.第一步:确定递归函数的返回值和参数:返回值无,参数为原…

Lucas-Kanade光流法详解

简介:个人学习分享,如有错误,欢迎批评指正。 光流(Optical Flow)描述的是图像序列中各像素点随时间的运动情况,是计算机视觉中的基本问题之一。光流问题涉及尝试找出一幅图像中的许多点在第二幅图像中移动的…