设计模式之 桥接模式 C# 范例

server/2024/12/18 19:03:06/

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象与实现解耦,使得两者可以独立变化。桥接模式通常适用于以下情形:

  1. 类的功能可以在不同的维度上变化,例如在图形界面开发中,可能有不同的形状和不同的颜色,你可以在这两者之间进行独立变化。
  2. 类的实现不应该直接依赖于具体实现,而是通过接口和抽象类进行解耦。

桥接模式的结构

  1. Abstraction(抽象类):定义了一个接口,并且持有一个实现对象的引用。
  2. RefinedAbstraction(扩展抽象类):是对Abstraction的具体化,实现了不同的业务方法。
  3. Implementor(实现接口):定义了所有具体实现类必须实现的接口。
  4. ConcreteImplementor(具体实现类):实现了Implementor接口的具体类。

示例:绘图应用程序(形状与颜色分离)

我们可以创建一个图形应用程序,其中有不同的形状(如圆形和方形)和不同的颜色(如红色、绿色)。我们希望能够独立地扩展形状和颜色的种类,而不需要修改现有的代码。

1. 定义实现接口(IColor
public interface IColor
{void Paint();
}
2. 实现具体颜色类(Red 和 Green
public class Red : IColor
{public void Paint(){Console.WriteLine("Painting in Red");}
}public class Green : IColor
{public void Paint(){Console.WriteLine("Painting in Green");}
}
3. 定义抽象类(Shape
public abstract class Shape
{protected IColor color;public Shape(IColor color){this.color = color;}public abstract void Draw();
}
4. 扩展具体形状(Circle 和 Square
 
public class Circle : Shape
{public Circle(IColor color) : base(color) { }public override void Draw(){Console.Write("Drawing Circle, ");color.Paint();}
}public class Square : Shape
{public Square(IColor color) : base(color) { }public override void Draw(){Console.Write("Drawing Square, ");color.Paint();}
}

5. 客户端使用
 
class Program
{static void Main(string[] args){IColor red = new Red();IColor green = new Green();Shape circle = new Circle(red);  // 圆形,红色Shape square = new Square(green);  // 方形,绿色circle.Draw();  // Drawing Circle, Painting in Redsquare.Draw();  // Drawing Square, Painting in Green}
}

运行结果

 
Drawing Circle, Painting in Red
Drawing Square, Painting in Green

分析

  • IColor 是实现接口,定义了颜色的抽象行为。
  • Red 和 Green 是具体的实现类,分别实现了不同颜色的绘制行为。
  • Shape 是抽象类,定义了形状的行为,依赖于 IColor 接口。
  • Circle 和 Square 是具体的形状类,通过构造函数接受颜色的实现对象,从而实现不同形状与颜色的组合。

总结

  • 优点

    • 可以独立地扩展形状和颜色类,而不需要修改现有代码。
    • 减少了子类的数目,避免了复杂的类继承结构。
    • 使得系统能够更灵活地扩展新功能。
  • 缺点

    • 增加了系统的抽象性,学习和理解曲线较为陡峭。
    • 对于非常简单的系统,可能引入不必要的复杂性。

桥接模式非常适合用在那些需要避免多重继承和扩展时,尤其是当系统的某个部分(如形状或颜色)频繁变化时。


http://www.ppmy.cn/server/151244.html

相关文章

WPF Combox使用 Text无法选择正确获取CHange后的Text

使用固定ComboxItem 无法通过 selectitem as object 来进行回去到 Content内的对香数据。那我只能这个样干&#xff1a; private void CBPaiweiLeixingSelect_Change(object sender, SelectionChangedEventArgs e){ ComboBox ThisBox sender as ComboBox;List<EDaxiaosuixi…

RabbitMQ如何构建集群?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ如何构建集群&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ如何构建集群&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中&#xff0c;集群&#xff08;Cluster&#x…

概率论公式整理

1 概率 古典概型和几何概型 古典概型&#xff08;有限等可能&#xff09;几何概型&#xff08;无限等可能&#xff09; 条件概率 P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) \frac{P(AB)}{P(B)} P(A∣B)P(B)P(AB)​ 全概率公式 P ( B ) ∑ i 1 n P ( A i ) P ( B ∣ A i ) P…

C# Visionpro 主窗体调用子窗体(自定义控件)按照行列进行显示(双击子窗体全窗口显示)

自定义控件界面及控件如下 控件列表 using Cognex.VisionPro; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst…

Flink DataStream API 编程指南

(对于Flink的开发,建议使用Java,Scala的支持未来会被移除) DataStream是什么 DataStream API得名于DataStream这个Java类,可以将它们视为可以包含重复项的不可变数据集合。该数据可以是有限的,也可以是无限的,用于处理它们的API是相同的。 DataStream在用法上和普通的…

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

glTF格式:WebGL应用的3D资产优化解决方案

摘要 glTF作为一种高效的3D资产格式&#xff0c;为WebGL、OpenGL ES和OpenGL运行时的应用提供了强有力的支持。它不仅简化了3D模型的传输与加载流程&#xff0c;还通过优化资产大小&#xff0c;使得打包、解包更加便捷。本文将深入探讨glTF格式的优势&#xff0c;并提供实用的代…

Sql注入(靶场)14-20关

第十四关 跟上面一样闭合换成" 第一步查询库名 " and updatexml(1,concat(1,(select database())),1)# 第二步查询表名 " and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)# 第…