c#桥接模式(bridge结构模式)用法实例

C#桥接模式(Bridge结构模式)用法实例

什么是C#桥接模式?

C#桥接模式,也称为Bridge模式,是一种结构性模式,它将抽象部分与实现部分分离,可以让它们相互独立地变化。这种模式属于结构型模式,它通过提供一个桥接接口,使得抽象和实现可以独立地扩展。

C#桥接模式的应用场景

C#桥接模式主要适用于以下场景:

  1. 当一个系统可能有多个角度分类(即多个维度的分类)时,使用桥接模式将进行分类的角度从类中抽象出来,使它们可以独立地变化。

  2. 当实现角度需要比抽象角度更加稳定时,使用桥接模式,因为抽象角度还可以发生变化,但是实现角度是比较稳定的,可以独立使用。

  3. 当一个类存在多个独立变化的维度,且需要扩展时,使用桥接模式。

C#桥接模式的实现步骤

C#桥接模式的实现步骤如下:

  1. 创建抽象类和实现类。

  2. 在抽象类中新增一个属性,该属性对象为实现类的对象。

  3. 在抽象类及其子类中,使用实现类对象来实现抽象类的方法。

  4. 创建测试类。

C#桥接模式的实例

以下是一个C#桥接模式的实例,通过此实例我们可以更好的理解桥接模式的使用方法。

public interface IMessageSender
{
    void SendMessage(string message);
}

public class EmailSender : IMessageSender
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Send email message: {message}");
    }
}

public class SmsSender : IMessageSender
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Send SMS message: {message}");
    }
}

public abstract class Message
{
    public IMessageSender MessageSender { get; set; }

    public abstract void Send(string message);
}

public class SystemMessage : Message
{
    public override void Send(string message)
    {
        Console.WriteLine($"System message: {message}");
        MessageSender.SendMessage(message);
    }
}

public class UserMessage : Message
{
    public override void Send(string message)
    {
        Console.WriteLine($"User message: {message}");
        MessageSender.SendMessage(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        IMessageSender emailSender = new EmailSender();
        IMessageSender smsSender = new SmsSender();

        var systemMessage = new SystemMessage();
        systemMessage.MessageSender = emailSender;
        systemMessage.Send("This is a system message sent by email.");

        var userMessage = new UserMessage();
        userMessage.MessageSender = smsSender;
        userMessage.Send("This is a user message sent by SMS.");
    }
}

在上述代码中,我们定义了IMessageSender接口,将发送消息的实现部分进行了抽象。我们定义了两个实现类EmailSenderSmsSender,分别用于发送邮件和短信。定义了一个抽象类Message,其中包含一个IMessageSender属性,用于引用实际的消息发送实现类。Message类同时定义了一个抽象方法Send(string message),子类需要实现此方法,以便根据不同的消息类别发送不同的消息内容。

最后我们定义了两个扩展类:SystemMessageUserMessage,用于具体实现消息的发送。在这两个类中,我们重写了MessageSend()方法,并使用MessageSender对象完成消息的发送。

Program类中,我们定义了两个发送对象:emailSendersmsSender,并创建了一个SystemMessage和一个UserMessage,分别用这两个发送对象进行消息发送。

运行上面的代码,会得到以下的输出结果:

System message: This is a system message sent by email.
Send email message: This is a system message sent by email.
User message: This is a user message sent by SMS.
Send SMS message: This is a user message sent by SMS.

从输出结果上可以看到,程序正确地将不同的消息类别,使用不同的发送对象进行了发送,这正是桥接模式的解决方案所在。

C#桥接模式的另一个实例

以下是C#桥接模式的另一个实例,通过另一个实例我们可以更好的理解桥接模式的用法。

interface IDrawAPI
{
    void DrawCircle(int radius, int x, int y);
}

class RedCircle : IDrawAPI
{
    public void DrawCircle(int radius, int x, int y)
    {
        Console.WriteLine("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", " + y + "]");
    }
}

class GreenCircle : IDrawAPI
{
    public void DrawCircle(int radius, int x, int y)
    {
        Console.WriteLine("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", " + y + "]");
    }
}

abstract class Shape
{
    protected IDrawAPI drawAPI;

    protected Shape(IDrawAPI drawAPI)
    {
        this.drawAPI = drawAPI;
    }

    public abstract void Draw();
}

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)
    {
        Shape redCircle = new Circle(100, 100, 10, new RedCircle());
        Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());

        redCircle.Draw();
        greenCircle.Draw();
    }
}

在上述代码中,定义了一个抽象的IDrawAPI接口,其中定义了一个基础的绘制方法DrawCircle()。同时,我们定义了两个继承了IDrawAPI的类:RedCircleGreenCircle,并分别实现了DrawCircle()方法,用于绘制不同颜色的圆。

接下来,我们创建了一个抽象类Shape,我们在抽象类中定义了一个成员对象drawAPI,并使用该对象来实现抽象方法Draw()

最后,我们创建一个使用Shape抽象类的扩展类:Circle,并在其构造函数中传入一个IDrawAPI对象。在Circle类中,我们重写了ShapeDraw()方法,并调用IDrawAPIDrawCircle()方法,以完成道具圈的绘制。

Program类中,我们创建了一个红色圆和一个绿色圆,并使用它们分别绘制了两个圆形。

运行上面的代码,会得到以下的输出结果:

Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[ color: green, radius: 10, x: 100, 100]

输出结果正确,说明桥接模式的使用正确无误。

总结

C#桥接模式是一种优秀的结构性设计模式,其通过将抽象类与其实现分离,让二者可以独立变化,在应对某些需要同时变化的对象方面,具有一定的优势。本文通过两个案例,详细讲解了C#桥接模式的用法,希望能对读者有所启发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#桥接模式(bridge结构模式)用法实例 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • MySQL中的布尔值,怎么存储false或true

    MySQL中的布尔值实际上是用tinyint类型来存储的,其中0代表false,1代表true。可以通过以下两种方式来存储和查询布尔值: 存储布尔值 在MySQL中,可以直接使用0或1来插入布尔值,也可以使用关键字true或false。例如,以下是如何插入true值的SQL语句: INSERT INTO `mytable` (`mybool`) VALUES…

    Java 2023年6月16日
    00
  • 如何解决通过spring-boot-maven-plugin package失败问题

    通过spring-boot-maven-plugin package失败的原因可能有很多,比如Maven依赖包版本问题、插件配置错误、代码编译错误等等。这里给出一份完善的攻略,来帮助解决这个问题。 1. 确认Maven依赖包版本 首先检查pom.xml文件中Maven依赖包的版本号,确保所有依赖包版本号与项目需要的依赖包版本一致。如果版本不一致可能导致编译失…

    Java 2023年6月2日
    00
  • springboot+mybatis通过实体类自动生成数据库表的方法

    下面我将详细讲解“springboot+mybatis通过实体类自动生成数据库表的方法”的完整攻略,其中会包含两个示例。 1. 引入依赖 首先,在工程的pom.xml文件中引入如下依赖: <!– Spring Boot 依赖 –> <dependency> <groupId>org.springframework.bo…

    Java 2023年5月20日
    00
  • AJAX 客户端响应速度提高分析

    AJAX 客户端响应速度提高分析 什么是 AJAX? AJAX(Asynchronous JavaScript and XML)即异步的 JavaScript 和 XML,是一种基于现有技术通过 JavaScript 进行的客户端与服务器的通信技术。AJAX 可以在不重新加载整个页面的情况下向服务器发送请求、接收数据并更新页面。 如何提高 AJAX 客户端响…

    Java 2023年6月15日
    00
  • Java如何基于poi操作Wold工具类

    下面是Java基于poi操作Word的完整攻略。 1. 简介 Apache POI是一个为Microsoft Office格式(如.docx和.xlsx)提供Java API的开源项目,其中包括对Word文档的操作。本攻略将重点介绍Java如何基于poi操作Word的方法。 2. 准备工作 在进行poi操作Word之前,需要先下载poi包,并导入到项目中。 …

    Java 2023年5月26日
    00
  • springboot 如何配置多个jndi数据源

    下面是详细讲解: 配置多个JNDI数据源 在Spring Boot中,可以使用application.properties或application.yml文件配置多个JNDI数据源。下面详细说明如何实现操作。 添加依赖 首先,需要在pom.xml文件中添加JNDI的支持依赖,例如: <dependency> <groupId>org.…

    Java 2023年5月20日
    00
  • 一文带你了解如何正确使用Java中的字符串常量池

    一文带你了解如何正确使用Java中的字符串常量池 什么是字符串常量池 在Java中,字符串常量池是JVM运行时数据区域的一部分,用来存放一些字符串常量,以便进行重用。 怎么使用字符串常量池 使用字符串常量创建字符串对象 Java中的字符串有两种创建方法:使用字符串常量和使用new操作符创建字符串对象。其中,使用字符串常量创建的字符串会首先尝试从字符串常量池中…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“InterruptedIOException”的原因与解决方法

    当使用Java的Struts框架时,可能会遇到“ActionServletMappingException”错误。这个错误通常由以下原因之一起: ActionServlet配置错误:如果ActionServlet配置错误,则可能会出现此错误。在这种情况下,需要检查ActionServlet配置以解决此问题。 ActionServlet无效:如果ActionS…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部