设计模式----中介模式

        今天,我们来学习下中介者模式,所谓中介者模式,就是充当一个中间人的角色,让两种不同领域的人沟通;把这句话转换为软件角色就是让有交集的两个类变得没有任何关系。没有关系就表明了两个类之间的耦合度为零,这就是我们需要的最终奥义,也是中介者模式要达到的目的。

       首先第一步,抽象一个中介者,这个中介者就干一件事,传递信息,所以,代码如下

abstract class Mediator
    {
        
        public abstract void Send(string message, Colleague colleague);

    }

        Mediator类就是我们抽象的一个中介者类,它有一个Send方法,方法参数有两个,一个message和一个Colleague,我们想一下,一个中介者是如何传递消息的,首先,它得到一个需要传递消息的人,然后把这个人的消息传递给更多的人,所以,这里的Colleague类型就是我们抽象出来的人的类

abstract class Colleague
    {
        protected Mediator mediator;
        public Colleague(Mediator mediator)
        {
            this.mediator = mediator;
        }
    }

       上面就是我们抽象的Colleague类,人当然需要中介者才能完成它想要完成的任务,所以,这里就是通过构造函数注入的方式获取一个中介者。好了,所有的抽象都已完成,接下来我们就来实现他们吧

       首先,我们先实现两个同事类吧

class ConcreteColleague1 : Colleague
    {
        public ConcreteColleague1(Mediator mediator) : base(mediator)
        { }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事1得到的信息:" + message);
        }
    }





class ConcreteColleague2 : Colleague
    {
        public ConcreteColleague2(Mediator mediator) : base(mediator)
        {

        }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事2得到的信息:" + message);
        }
    }

       ConcreteColleague1类和ConcreteColleague2类就是我们实现的同事类,他们都继承Colleague类,到了这里可能会有点蒙,我们来梳理一下,首先是Send方法,这里是在做什么事呢?我们看到它的内部是调用了Send方法,这个Send方法就是我们抽象的中介者的Send方法,然后把消息和自身传递给中介者,供中介者使用,然后Notify方法就是输入自身的交互信息。接下来,我们要实现中介者抽象了,我们需要一个具体的中介者来帮忙做事。

 class ConcreteMediator : Mediator
    {
        private ConcreteColleague1 concrete1;
        private ConcreteColleague2 concrete2;

        public ConcreteColleague1 Colleague1
        {
            set { concrete1 = value; }
        }
        public ConcreteColleague2 Colleague2
        {
            set { concrete2 = value; }
        }
        public override void Send(string message, Colleague colleague)
        {
            if (colleague == concrete2) concrete2.Notify(message);
            else concrete1.Notify(message);


        }
    }

        我们可以看到,ConcreteMediator类中有两个属性和一个方法,根据我们生活的常识来说,一个具体的中介者,是不是需要认识双发需要交流的人,所以这里我们也需要获取ConcreteColleague1ConcreteColleague2,然后重写父类MediatorSend方法,到这里我们的中介者模式所以骨架就都完成了,接下来,让我们来看看如何使用它。

class Program
    {
        static void Main(string[] args)
        {
            ConcreteMediator m = new ConcreteMediator();

            ConcreteColleague1 c1 = new ConcreteColleague1(m);
            ConcreteColleague2 c2 = new ConcreteColleague2(m);

            m.Colleague1 = c1;
            m.Colleague2 = c2;

            c1.Send("吃过饭了吗?");
            c2.Send("没有呢,你打算请客?");

            Console.Read();
        }
    }

        首先,第一步,我们先new一个中介者出来,然后再new两位同事出来,我们new出来的这两位同事肯定是要和中介者认识啊(所以new需要一个中介者对象m),然后他们都会各自去找我们的中介者(把自身对象传递给中介者),最后,他们就可以发送消息通信了,我们看运行结果

        本来两个不相干的类,通过中介者模式可以实现交互,这是多么的神奇啊是吧。

        官方说明中介者模式概述:可以把系统的网状结构变成以中介者为中心的星型结构。这样转变的好处就是保证了对象结构上的稳定,系统的结构不会因为引入新对象而带来大量的修改工作。

posted @ 2019-04-14 16:55  守望阳光01  阅读(311)  评论(0编辑  收藏  举报