问题背景

  1. 在外观模式下也提到,一个游戏是由很多系统组成的,我们将其抽象为子系统,显然,子系统里面也会相互联系。如果用结构图表示,那么他们是**网状**的。

游戏开发中的中介者模式 - 图1

  1. 显然,这样是很复杂的。

问题解决

  1. 就像买房有中介一样,我们也能给子系统添加一个“中介”,通过中介者来对子系统建立联系。如果用结构图表示,那么他们是**星状**的。

游戏开发中的中介者模式 - 图2

中介者模式

定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

解决问题:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

解决形式:网状结构=>星状结构

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

游戏开发中的中介者模式 - 图3

板子

Mediator.cs

  1. public abstract class Mediator
  2. {
  3. //发送消息方法,得到同事对象和发送消息
  4. public abstract void Send(string message,Colleague colleague);
  5. }

Colleague.cs

  1. public abstract class Colleague
  2. {
  3. protected Mediator m_mediator;
  4. //构造方法 得到中介者对象
  5. public Colleague(Mediator theMediator)
  6. {
  7. m_mediator = theMediator;
  8. }
  9. }

ConcreteMediator.cs

  1. class ConcreteMediator : Mediator
  2. {
  3. private ConcreteColleague1 colleague1;
  4. private ConcreteColleague2 colleague2;
  5. public ConcreteColleague1 Colleague1
  6. {
  7. set{ colleague1 = value; }
  8. }
  9. public ConcreteColleague2 Colleague2
  10. {
  11. set{ colleague2 = value; }
  12. }
  13. //中转
  14. public override void Send(string message, Colleague colleague)
  15. {
  16. if(colleague == colleague1)
  17. {
  18. colleague2.Notify(message);
  19. }
  20. else
  21. {
  22. colleague1.Notify(message);
  23. }
  24. }
  25. }

ConcreteColleague1.cs

  1. public ConcreteColleague1(Mediator theMediator) : base(theMediator)
  2. {
  3. }
  4. public void Send(string message)
  5. {
  6. //发出信息时通常是中介者发去的
  7. m_mediator.Send(message,this);
  8. }
  9. public void Notify(string message)
  10. {
  11. Console.WriteLine("同事1得到信息:" + message);
  12. }

ConcreteColleague2.cs

  1. class ConcreteColleague2 : Colleague
  2. {
  3. public ConcreteColleague2(Mediator theMediator) : base(theMediator)
  4. {
  5. }
  6. public void Send(string message)
  7. {
  8. //发出信息时通常是中介者发去的
  9. m_mediator.Send(message,this);
  10. }
  11. public void Notify(string message)
  12. {
  13. Console.WriteLine("同事2得到信息:" + message);
  14. }
  15. }

应用实例

《设计模式与游戏完美开发》中的例子

游戏开发中的中介者模式 - 图4

其中,还用了观察者模式。