问题背景
在外观模式下也提到,一个游戏是由很多系统组成的,我们将其抽象为子系统,显然,子系统里面也会相互联系。如果用结构图表示,那么他们是**网状**的。
显然,这样是很复杂的。
问题解决
就像买房有中介一样,我们也能给子系统添加一个“中介”,通过中介者来对子系统建立联系。如果用结构图表示,那么他们是**星状**的。
中介者模式
定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
解决问题:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
解决形式:网状结构=>星状结构
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
板子
Mediator.cs
public abstract class Mediator
{
//发送消息方法,得到同事对象和发送消息
public abstract void Send(string message,Colleague colleague);
}
Colleague.cs
public abstract class Colleague
{
protected Mediator m_mediator;
//构造方法 得到中介者对象
public Colleague(Mediator theMediator)
{
m_mediator = theMediator;
}
}
ConcreteMediator.cs
class ConcreteMediator : Mediator
{
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public ConcreteColleague1 Colleague1
{
set{ colleague1 = value; }
}
public ConcreteColleague2 Colleague2
{
set{ colleague2 = value; }
}
//中转
public override void Send(string message, Colleague colleague)
{
if(colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
ConcreteColleague1.cs
public ConcreteColleague1(Mediator theMediator) : base(theMediator)
{
}
public void Send(string message)
{
//发出信息时通常是中介者发去的
m_mediator.Send(message,this);
}
public void Notify(string message)
{
Console.WriteLine("同事1得到信息:" + message);
}
ConcreteColleague2.cs
class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(Mediator theMediator) : base(theMediator)
{
}
public void Send(string message)
{
//发出信息时通常是中介者发去的
m_mediator.Send(message,this);
}
public void Notify(string message)
{
Console.WriteLine("同事2得到信息:" + message);
}
}
应用实例
《设计模式与游戏完美开发》中的例子
其中,还用了观察者模式。