发送消息可以看作一个功能,也可以继续拆分为怎么发消息,发什么消息两个环节。便于单独维护。
AbstractPublisher(发布消息抽象类):定义抽象行为,比如Send()发送。
Publisher(发布消执行类):用于引导消息发送上下文的,决定怎么发消息。
XXXPublisher(发布消息实现类):用于实现发送什么类型消息,决定发什么消息。
引用关系:XXXPublisher : AbstractPublisher
分析:
比起直接使用继承(接口或者基类),桥接这种方式把单一的++发消息++维度拆解成了 ++怎么发消息/发什么消息++ 两种维度,并把这两种维度在抽象层面建立联系,提高了扩展性(能独立管理两者)。
but,多维度拆解对象意味着复杂性也增加了,需要在使用时候保证多个实例正确实例化。
程序实现
using System;
namespace Bridge
{
#region 发布消息抽象模型
/// <summary>
/// 消息实体
/// </summary>
public class Message
{
public string Id { get; set; }
}
/// <summary>
/// 发布消息抽象类
/// </summary>
public abstract class AbstractPublisher
{
public abstract void Send(Message objMessage);
}
/// <summary>
/// 发布消息类
/// </summary>
public class Publisher
{
public AbstractPublisher AbstractPublisher { get; set; }
public virtual void Send(Message objMessage)
{
AbstractPublisher.Send(objMessage);
}
}
#endregion
#region 发布消息具体实现类
/// <summary>
/// RabbitMq发布消息类
/// </summary>
public class RabbitMqPublisher : AbstractPublisher
{
public override void Send(Message objMessage)
{
Console.WriteLine("RabbitMq发布消息");
}
}
/// <summary>
/// Kafka发布消息类
/// </summary>
public class KafkaPublisher : AbstractPublisher
{
public override void Send(Message objMessage)
{
Console.WriteLine("Kafka发布消息");
}
}
#endregion
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
publisher.AbstractPublisher = new RabbitMqPublisher();
publisher.Send(new Message());
publisher.AbstractPublisher = new KafkaPublisher();
publisher.Send(new Message());
Console.ReadKey();
}
}
}
网友评论