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


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

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

    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),然后他们都会各自去找我们的中介者(把自身对象传递给中介者),最后,他们就可以发送消息通信了,我们看运行结果

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

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

  • 相关阅读:
    使用Python操作InfluxDB时序数据库
    LogMysqlApeT
    内建函数 iter()
    Python魔法方法总结及注意事项
    Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )
    Python描述符 (descriptor) 详解
    在命令行模式下查看Python帮助文档---dir、help、__doc__
    python高并发的解决方案
    map中的erase成员函数用法
    指针的本质
  • 原文地址:https://www.cnblogs.com/liuhuimh/p/10705818.html
Copyright © 2020-2023  润新知