.NET程序员

桥接模式-多维度拆解对象

2019-12-10  本文已影响0人  Carson_jz

发送消息可以看作一个功能,也可以继续拆分为怎么发消息,发什么消息两个环节。便于单独维护。

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();
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读