码迷,mamicode.com
首页 > 其他好文 > 详细

中介者模式

时间:2020-01-13 22:15:32      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:tab   指定   ***   中间   一个   轻松   rgs   ted   传递   

一张图片得以理解为什么要使用中介者模式:

技术图片

各个对象之间相互引用,紧耦合体现的淋漓尽致,如果此时需要发生变化,那么改代码就糟糕了,因为无法修改。

如果我们使用一个中介者来完成对象之间的交互,那么看起来明朗多了,每个对象只需要与中介者产生联系,将请求通过中介者发给接收对象,这有点像依赖倒转原则,这样不但看起来清晰,以后再修改逻辑的时候将会十分的方便与轻松。这就是中介者模式

 

 

 技术图片

适用性:
    1.一组对象已经定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
    3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。

***###***

每个对象可以接收指定对象的消息,也可以给指定的对象发送消息

中介者可以指定某个对象给另一个对象发送某些消息

 #region 抽象中介者
    abstract class AbstractChatroom
    {
        public abstract void Register(Participant participant);//可注册成员
        public abstract void Send(string from, string to, string message);//可传递消息
    }
    #endregion
   #region 具体中介者
    class Chatroom : AbstractChatroom
    {
        protected Hashtable hash = new Hashtable();
        public Hashtable Hash { get; }
        public override void Register(Participant participant)
        {
            if (hash[participant.name] == null)//如果没有注册该人
            {
                hash[participant.name] = participant;
            }
            participant.chatroom = this;//注册该实例内部的中间者为此中介者,这个是重点
        }

        public override void Send(string from, string to, string message)
        {
            if(hash[to]!=null)
            {
                ((Participant)hash[to]).Receive(from,message);
            }
        }
    }
    #endregion
  #region 对象成员基类
    class Participant
    {
        public Chatroom chatroom { get; set; }
        public string name { get; set; }
        public Participant(string name)
        {
            this.name = name;
        }
        public void Send(string to,string message)
        {
            chatroom.Send(this.name,to,message);//通过中介者将所有的逻辑全部写在Receive中
        }
        public virtual void Receive(string from,string message)
        {
            Console.WriteLine("{0} to {1}:‘{2}‘", from, name, message);
        }
    }
    #endregion
  #region 具体成员类
    class Beatle: Participant
    {
        public Beatle(string name) : base(name)
        {
        }

        public override void Receive(string from, string message)
        {
            Console.WriteLine("Beatle Receive");
            base.Receive(from,message);
        }
    }
    class NoBeatle : Participant
    {
        public NoBeatle(string name) : base(name)
        {
        }
        public override void Receive(string from, string message)
        {
            Console.WriteLine("NoBeatle Receive");
            base.Receive(from, message);
        }
    }
    #endregion
 static void Main(string[] args)
        {
            Chatroom chatroom = new Chatroom();
            //构建成员
            Participant participant1 = new Beatle("小王");
            Participant participant2 = new Beatle("小飞");
            Participant participant3 = new NoBeatle("小李");
            //注册到中介者
            chatroom.Register(participant1);
            chatroom.Register(participant2);
            chatroom.Register(participant3);

            participant1.Send("小飞", "发送消息喽");
            Console.ReadKey();
        }

 

技术图片

 

 

上述案例,体现了中介者中,虽然对象可以接收也可以发送,也可以通过中介者来实信息传递,如果每个地方都写一次逻辑的话,那么将使得代码十分混乱与复杂,巧妙的使用代码, 让所有逻辑写在发送或者接收里(不论使用接收还是发送,使用哪个,就需要在基类中定义该方法为虚方法,这样转过来的时候才会触发真正覆盖的实例方法)

这就是中介者模式喽!

中介者模式

标签:tab   指定   ***   中间   一个   轻松   rgs   ted   传递   

原文地址:https://www.cnblogs.com/ningxinjie/p/12189217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!