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

 更新时间:2023年05月05日 10:31:48   作者:iukam  
中介者模式是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#隐式/显示实现接口方法详解

    C#隐式/显示实现接口方法详解

    这篇文章主要为大家详细介绍了C#隐式/显示实现接口方法,接口的使用场景介绍,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 同步调用和异步调用WebService

    同步调用和异步调用WebService

    本文给大家介绍webservice同步调用和异步调用,同步调用就是一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码,异步调用不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成。小伙伴们跟着小编一起学习
    2015-09-09
  • C#中动态数组用法实例

    C#中动态数组用法实例

    这篇文章主要介绍了C#中动态数组用法,实例分析了C#中ArrayList实现动态数组的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • c# 遍历获取所有文件的示例代码

    c# 遍历获取所有文件的示例代码

    这篇文章主要介绍了c# 遍历获取所有文件的示例代码,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-12-12
  • C#使用NUnit进行单元测试详解

    C#使用NUnit进行单元测试详解

    NUnit是一个开源的.Net单元测试框架,经常被用来在.Net体系下做白盒测试,本文主要为大家详细介绍了如何C#如何使用NUnit进行单元测试,感兴趣的可以了解下
    2023-12-12
  • C# FTP操作类分享

    C# FTP操作类分享

    这篇文章主要为大家分享了C# FTP操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#用ComboBox控件实现省与市的联动效果的方法

    C#用ComboBox控件实现省与市的联动效果的方法

    这篇文章主要介绍了C#用ComboBox控件实现省与市的联动效果的方法,较为详细的分析了ComboBox控件的使用原理与相关技巧,需要的朋友可以参考下
    2015-01-01
  • C#实现判断图形文件格式的方法

    C#实现判断图形文件格式的方法

    这篇文章主要介绍了C#实现判断图形文件格式的方法,包括常见的扩展名判定及文件内容判定等,非常实用,需要的朋友可以参考下
    2014-09-09
  • C#读取写入文件的3种方式示例代码

    C#读取写入文件的3种方式示例代码

    最近操作文件频繁,所以这篇文章主要给大家介绍了关于C#读取写入文件的3种方式,文中通过实例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友可以参考下
    2022-06-06
  • WPF基于物理像素绘制图形

    WPF基于物理像素绘制图形

    这篇文章介绍了WPF基于物理像素绘制图形的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论