C#桥接模式(Bridge结构模式)用法实例
什么是C#桥接模式?
C#桥接模式,也称为Bridge模式,是一种结构性模式,它将抽象部分与实现部分分离,可以让它们相互独立地变化。这种模式属于结构型模式,它通过提供一个桥接接口,使得抽象和实现可以独立地扩展。
C#桥接模式的应用场景
C#桥接模式主要适用于以下场景:
-
当一个系统可能有多个角度分类(即多个维度的分类)时,使用桥接模式将进行分类的角度从类中抽象出来,使它们可以独立地变化。
-
当实现角度需要比抽象角度更加稳定时,使用桥接模式,因为抽象角度还可以发生变化,但是实现角度是比较稳定的,可以独立使用。
-
当一个类存在多个独立变化的维度,且需要扩展时,使用桥接模式。
C#桥接模式的实现步骤
C#桥接模式的实现步骤如下:
-
创建抽象类和实现类。
-
在抽象类中新增一个属性,该属性对象为实现类的对象。
-
在抽象类及其子类中,使用实现类对象来实现抽象类的方法。
-
创建测试类。
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
接口,将发送消息的实现部分进行了抽象。我们定义了两个实现类EmailSender
和SmsSender
,分别用于发送邮件和短信。定义了一个抽象类Message
,其中包含一个IMessageSender
属性,用于引用实际的消息发送实现类。Message
类同时定义了一个抽象方法Send(string message)
,子类需要实现此方法,以便根据不同的消息类别发送不同的消息内容。
最后我们定义了两个扩展类:SystemMessage
和UserMessage
,用于具体实现消息的发送。在这两个类中,我们重写了Message
的Send()
方法,并使用MessageSender
对象完成消息的发送。
在Program
类中,我们定义了两个发送对象:emailSender
和smsSender
,并创建了一个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
的类:RedCircle
和GreenCircle
,并分别实现了DrawCircle()
方法,用于绘制不同颜色的圆。
接下来,我们创建了一个抽象类Shape
,我们在抽象类中定义了一个成员对象drawAPI
,并使用该对象来实现抽象方法Draw()
。
最后,我们创建一个使用Shape
抽象类的扩展类:Circle
,并在其构造函数中传入一个IDrawAPI
对象。在Circle
类中,我们重写了Shape
的Draw()
方法,并调用IDrawAPI
的DrawCircle()
方法,以完成道具圈的绘制。
在Program
类中,我们创建了一个红色圆和一个绿色圆,并使用它们分别绘制了两个圆形。
运行上面的代码,会得到以下的输出结果:
Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[ color: green, radius: 10, x: 100, 100]
输出结果正确,说明桥接模式的使用正确无误。
总结
C#桥接模式是一种优秀的结构性设计模式,其通过将抽象类与其实现分离,让二者可以独立变化,在应对某些需要同时变化的对象方面,具有一定的优势。本文通过两个案例,详细讲解了C#桥接模式的用法,希望能对读者有所启发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#桥接模式(bridge结构模式)用法实例 - Python技术站