中介者模式:
中介者模式(Mediator),用一个中介对象来封装一些列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
结构图:
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 中介者模式
{
class Program
{
static void Main(string[] args)
{
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
c1.Declare("不准研制核武器,否者发动战争");
c2.Declare("我们没有核武器,也不怕战争");
Console.Read();
}
}
abstract class UnitedNations //联合国机构
{
public abstract void Declare(string message, Country colleague);
}
abstract class Country //国家
{
protected UnitedNations mediator;
public Country(UnitedNations mediator)
{
this.mediator = mediator;
}
}
class USA : Country //美国
{
public USA(UnitedNations mediator) : base(mediator)
{ }
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("美国获取对方信息" + message);
}
}
class Iraq : Country //伊拉克
{
public Iraq(UnitedNations mediator) : base(mediator)
{ }
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("伊拉克获取对方信息" + message);
}
}
class UnitedNationsSecurityCouncil : UnitedNations
{
private USA colleague1;
private Iraq colleague2;
public USA Colleague1
{
set { colleague1 = value; }
}
public Iraq Colleague2
{
set { colleague2 = value; }
}
public override void Declare(string message, Country colleague)
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
}
我们通过创建“联合国机构”这个抽象中介者和具体中介者“联合或安理会”,然后在创建抽象的同事类“国家”,然后创建具体同事类“美国”、“伊拉克”,然后 实例化 美国和伊拉克,当美国伊拉克分别声明的时候,把消息传给中介 联合国安理会,它接收到以后分别发给美国和伊拉克就OK了。
总结:
中介者模式容易在系统中应用,但是也容易在系统中误用,所以当系统出现“多对多”复杂交互对象的时候,我们要先反思是不是设计上不合理,然后在考虑使用中介者模式,同时,由于ConcreteMediator控制了集中化,于是就把交互复杂性变成了中介者的复杂性,这就使得中介者很复杂,中介者一般用于一组对象以定义良好单复杂的方式进行通信的场合。