【中介者模式】
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互
【介绍】
-
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理
-
何时使用:多各类相互耦合,形成了网状结构
-
如何解决:将上述网状结构分离为星型结构
-
关键代码:对象Colleague之间的通信封装到一个类中单独处理
-
优点:降低了类的复杂度,将一对多转化为一对一;各个类之间的解耦;符合迪米特法则
-
缺点:中介者会变得庞大,变得复杂难以维护
-
注意事项:不应当再职责混乱的时候使用
【实现】
步骤一:Mddiator类:中心机构
abstract class UniteNations
{
//声明
public abstract void Declare(string message, Country colleague);
}
步骤二:Colleague类:皮皮类
abstract class Country
{
protected UniteNations mediator;
public Country (UniteNations mediator)
{
this.mediator = mediator;
}
}
步骤三:ConcreteColleague类:具体皮皮
class HUA:Country //皮皮华类
{
public HUA (UniteNations mediator ):base (mediator)
{ }
//声明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//获取消息
public void GetMessage(string messgae)
{
Console.WriteLine("皮皮鬼 获得对方信息 :"+messgae );
}
}
class JIE : Country //皮皮杰类
{
public JIE(UniteNations mediator) : base(mediator)
{ }
//声明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//获取消息
public void GetMessage(string messgae)
{
Console.WriteLine("皮皮杰 获得对方信息:" + messgae);
}
}
步骤四:ConcreteMediator类:大米时代
class Damishidai:UniteNations
{
private HUA colleague1;
private JIE colleague2;
//皮皮华
public HUA Colleague1
{
set { colleague1 = value; }
}
//皮皮杰
public JIE Colleague2
{
set { colleague2 = value; }
}
//声明
public override void Declare(string message, Country colleague)
{
if (colleague ==colleague1 )
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
步骤五:客户端代码
class Program
{
static void Main(string[] args)
{
Damishidai dmsd = new Damishidai();
HUA c1 = new HUA(dmsd);
JIE c2 = new JIE(dmsd);
dmsd.Colleague1 = c1;
dmsd.Colleague2 = c2;
c1.Declare("好好学习,天天向下");
c2.Declare("切,不屑一顾");
Console.Read();
}
}
步骤六:运行结果
皮皮杰 获得对方信息:好好学习,天天向下
皮皮华 获得对方信息 :切,不屑一顾
【总结】
由于把对象如何进行协作进行了抽象,将中介作为一个独立的概念并将齐封装到一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统