Unity游戏开发中的中介者模式的应用与实现

unity游戏开发中的中介者模式的应用与实现

 

一、使用中介者模式的原因

随着项目功能越多,系统切分越细,系统之间的沟通越复杂,这时系统内部如果一直保存这种状态,就会产生如下缺点:

  • 单一系统引入太多其他系统的功能,不利于单一系统的转换和维护;
  • 单一系统被过多的系统所依赖,不利于接口的更改,容易牵一发而动全身;
  • 因为需提供给其他系统操作,系统的接口可能过于庞大,不容易维护;

要解决上述问题,可以使用中介者模式的设计方法。

 

二、中介者模式的定义

中介者模式简单解释的话,比较类似于中央管理的概念:建一个信息集中的中心,任何子系统要与它的子系统沟通时,都必须先将请求交给中央单位,再由中央单位分配给对应的子系统。

中介者模式在gof中的说明:定义一个接口用来封装一群对象的互动行为。中介者通过移除对象之间的引用,来减少它们之间的耦合度,并且能改变它们之间的互动独立性。

 

三、中介者模式的使用说明

创建一个中介者模式的结构如图:

其中的参与者如下:

colleague(同事接口)

  • 拥有一个mediator属性成员,可以通过它来调用中介的功能。

concretecolleaguex(同事接口实现类)

  • 实现colleague界面的类,对于单一实现类而言,只会依赖一个mediator接口。

mediator(中介者接口)、concretemediator(中介者接口实现类)

  • 由mediator定义让colleague类操作的接口。
  • concretemediator实现类中包含所有concretecolleague的对象引用。
  • concretemediator类之间的互动会在concretemediator中发生。

介绍一个gof范例程序如下:

colleague(同事接口)

  public abstract class colleague
  {
      protected mediator mediator = null;//通过mediator对外沟通
      public colleague(mediator mediator)
      {
          this.mediator = mediator;
      }
      /// <summary>
      /// mediator 请求通知
      /// </summary>
      public abstract void request(string message);
  }

colleague为抽象类,拥有一个类型为mediator的属性成员mediator ,用来指向中介者,而这个中介者会在建造者中被指定。

实现各colleague类:

public class concretecolleague1:colleague
  {
      public concretecolleague1(mediator mediator):base(mediator)
      {
      }
      /// <summary>
      /// 执行动作
      /// </summary>
      public void action()
      {
          //执行后需要通知其他colleague
          mediator.sendmessage(this, "colleage1 发出通知");
      }
      /// <summary>
      /// mediator 通知请求
      /// </summary>
      /// <param name="message"></param>
      public override void request(string message)
      {
      }
  }
  public class concretecolleague2:colleague
  {
      public concretecolleague2(mediator mediator):base(mediator)
      {
      }
      /// <summary>
      /// 执行动作
      /// </summary>
      public void action()
      {
          //执行后需要通知其他colleague
          mediator.sendmessage(this, "colleage2 发出通知");
      }
      /// <summary>
      /// mediator 通知请求
      /// </summary>
      /// <param name="message"></param>
      public override void request(string message)
      {
      }
  }

每一个继承自colleague的concretecolleaguex类,需要对外界沟通时,都会通过mediator来传递信息。

mediator接口,用来管理colleague对象的接口:

    public abstract class mediator
  {
      public abstract void sendmessage(colleague colleague, string message);
  }

mediator定义了一个抽象方法sendmessage(),主要用于从外界传递信息给colleague。

最后,实现concretemediator类,该类拥有所有“要在内部进行沟通的colleague子类的引用”:

    public class concretemediator:mediator
  {
      concretecolleague1 colleague1 = null;
      concretecolleague2 colleague2= null;
      public void setcolleague1(concretecolleague1 colleague1)
      {
          this.colleague1 = colleague1;
      }
      public void setcolleague2(concretecolleague2 colleague2)
      {
          this.colleague2 = colleague2;
      }
      /// <summary>
      /// 收到来自colleague请求
      /// </summary>
      public override void sendmessage(colleague colleague, string message)
      {
          //收到colleague1通知colleague2
          if (colleague1 == colleague)
              colleague2.request(message);
          //收到colleague2通知colleague1
          if (colleague2 == colleague)
              colleague1.request(message);
      }
  }

实现中介者模式的测试:

public class mediatortest
  {
      public void unittest()
      {
          //产生中介者
          concretemediator concretemediator = new concretemediator();
          //产生两个colleague
          concretecolleague1 colleague1 = new concretecolleague1(concretemediator);
          concretecolleague2 colleague2 = new concretecolleague2(concretemediator);
          //设置给中介者
          concretemediator.setcolleague1(colleague1);
          concretemediator.setcolleague2(colleague2);
          //执行
          colleague1.action();
          colleague2.action();
      }
  }

 

四、中介者模式的优点和注意事项

中介者模式具备以下优点:

不会引入太多其他的系统; 系统被依赖的程度也降低;

注意事项:

1、在某些情况下会出现中介者类担任过多中介者角色而产生“操作接口爆炸”的情况,这时需要配合其他设计模式来处理。

2、中介者接口没有继承任何接口类。这样对于所有游戏系统和玩家界面而言,它们所依赖的将是“接口”而不是“实现”,这样会更符合开—闭原则(ocp),从而提高游戏系统和玩家界面的可移植性。

总结:

中介者模式的优点是能让系统之间的耦合度降低,提升系统的可维护性。但身为模式中的中介者角色类,也会存在接口过大的风险,此时必须配合其他模式来进行优化。

关于unity游戏开发中的中介者模式的应用与实现的文章就介绍至此,更多相关unity中介者模式内容请搜索硕编程以前的文章,希望以后支持硕编程

下一节:利用c#/vb.net实现ppt转换为html

c# 教程

相关文章