博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式----中介模式
阅读量:5934 次
发布时间:2019-06-19

本文共 3042 字,大约阅读时间需要 10 分钟。

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

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

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

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

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

转载于:https://www.cnblogs.com/liuhuimh/p/10705818.html

你可能感兴趣的文章
C语言第六次作业--数据类型
查看>>
sersync简介与测试报告
查看>>
CentOS关闭防火墙
查看>>
Oracle回收站 使用
查看>>
MySQL--3约束和修改数据表总结
查看>>
Hadoop学习(1)-- 入门介绍
查看>>
8.5 SQL Server 代理
查看>>
hive 的一个小问题
查看>>
冒泡排序+二分法查找
查看>>
easyUI的下拉框combobox与树tree联动
查看>>
uboot学习之一-----源码配置
查看>>
verify验证插件的详解
查看>>
Ok335xS U-Boot 进度条原理跟踪
查看>>
PHP操作Mysql
查看>>
换零钞——第九届蓝桥杯C语言B组(国赛)第一题
查看>>
linux远程传输文件至windows
查看>>
(转)让文字讲好banner的故事
查看>>
java学习之租车系统
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
最优二叉搜索树 java实现 学习 备忘
查看>>