很久以前,小小少女情怀的我,怀揣一个美丽的春梦,那就是找一个男孩儿,从心动走到古稀,随着时间的推移,我听到这样的话语,你太天真,可是我仍然愿意相信,冰心对铁凝说的那句话,你不要找,你要等。爱情是美好的,但不是每个人都能收获自己的爱情,别担心,婚庆公司帮你忙,百合网是中国第一家实名制婚恋服务商,以“帮助亿万中国人拥有幸福的婚姻和家庭”为己任。2005年5月,百合网正式发布,并在中国首次推出“心灵匹配,成就幸福婚姻”的独特婚恋服务模式。
2007年3月,百合网成为第一个采用公安部身份认证系统的婚恋网站。百合网率先实行实名制。目前,已有超过7000万注册用户在百合网上寻找他们的终生伴侣。今天我们的设计模式就从婚姻公司开始说起---中介者模式。顾名思义,中介的意思就是指在不同事物或同一事物内部对立两极之间起居间联系作用的环节。官方定义,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变她们之间的交互,来看一下中介者模式的结构图:
![](https://box.kancloud.cn/2015-12-30_5683744378761.jpg)
依然以我们上述的婚庆公司为例,来探究一下中介者模式是如何应用的,试想一下,在没有婚庆公司之前,大家之间的交流是这个样子的:
![](https://box.kancloud.cn/2015-12-30_568374438a3e1.jpg)
大家看着是不是有种凌乱的感觉,如果人的数目多起来就会变成网状的结构啦。在我们的软件世界中,原本把一个系统分割成一些对象是可以增强复用性的,但是现在的情况是,这些兑现之间存在着大量的联系,耦合性极高。这是很不利于复用的,同时这种情况使得系统的灵活性大大的降低,使得对系统的扩展很难。如果现在可以借助婚庆公司,那么可以采用另一种方式设计上述的案例,如下:
![](https://box.kancloud.cn/2015-12-30_5683744396ffe.jpg)
看看“网状结构”和“星形结构”的区别,显然采用星形结构就可以避免上面的网状结构存在的问题了,实际上这里的婚庆公司就是指的中介,大家可以通过婚庆公司来进行交流。看一下这个例子的代码结构图:
![](https://box.kancloud.cn/2015-12-30_56837443a37a7.jpg)
接着来看一下,我们的代码实现:
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Baihe Bh = new Baihe();
Boy c1 = new Boy(Bh);
Girl c2=new Girl (Bh );
Bh.Colleague1 = c1;
Bh.Colleague2 = c2;
c1.Declare("我想找一个女朋友,给她世上最好的温柔!");
c2.Declare("如果明天的路,你不知道该往哪儿走,就留在我身边好不好!");
Console.Read();
}
}
//婚庆公司类,相当于Mediator类
//婚庆公司
abstract class WeddingCompany
{
//声明
public abstract void Declare(string message, People colleague);
}
//人类 相当于Colleague类
abstract class People
{
protected WeddingCompany mediator;
public People (WeddingCompany mediator)
{
this.mediator = mediator;
}
}
//男孩类 相当于ConcreteColleague1类
//男孩
class Boy :People
{
public Boy(WeddingCompany mediator):base( mediator )
{ }
//声明
public void Declare (string message)
{
mediator.Declare(message, this);
}
//获得信息
public void GetMessage(string message)
{
Console.WriteLine("我想找一个女朋友,给她世上最好的温柔");
}
}
//女孩类 相当于ConcreteColleague2类
//女孩
class Girl:People
{
public Girl (WeddingCompany mediator):base(mediator )
{ }
//声明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//获得消息
public void GetMessage(string message)
{
Console.WriteLine("如果明天的路,你不知道往哪儿走,就留在我身边好不好");
}
}
//具体的婚庆公司,百合网这里相当于ConcreteMediator类
//百合网
class Baihe:WeddingCompany
{
private Boy colleague1;
private Girl colleague2;
//男孩
private Boy Colleague1
{ set { colleague1 = value; } }
//女孩
private Girl Colleague2
{ set { colleague2 = value; } }
//声明
public override void Declare(string message, People colleague)
{
if (colleague ==colleague1 )
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
}
~~~
也许有一天,他真的会出现在我面前,那个在阳光底下微笑的少年,也许有一天,我们会一起去看北极光,我会和他一起仰望星空,谈论当初冰心对铁凝说的话,我不知道直到多久以后的某一天,他真的会出现,但可以确定的是,编程就是生活。