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#实现操作windows系统服务(service)的方法

    C#实现操作windows系统服务(service)的方法

    这篇文章主要介绍了C#实现操作windows系统服务(service)的方法,可实现系统服务的启动和停止功能,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • WinForm实现自定义右下角提示效果的方法

    WinForm实现自定义右下角提示效果的方法

    这篇文章主要介绍了WinForm实现自定义右下角提示效果的方法,涉及WinForm自定义提示效果的实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 剖析设计模式编程中C#对于组合模式的运用

    剖析设计模式编程中C#对于组合模式的运用

    这篇文章主要介绍了设计模式编程中C#对于组合模式的运用,理论上来说组合模式包含抽象构件、树叶构件和树枝构件三个角色,需要的朋友可以参考下
    2016-02-02
  • c# 面试必备线程基础知识点

    c# 面试必备线程基础知识点

    这篇文章主要介绍了c# 面试必备线程基础知识点,帮助大家更好的巩固,掌握线程的基础知识,感兴趣的朋友可以了解下
    2020-11-11
  • C#中的递归APS和CPS模式详解

    C#中的递归APS和CPS模式详解

    这篇文章主要介绍了C#中的递归APS和CPS模式详解,本文讲解了累加器传递模式、CPS函数、CPS变换、CPS尾递归、尾递归与Continuation等内容,需要的朋友可以参考下
    2015-04-04
  • .Net WInform开发笔记(五)关于事件Event

    .Net WInform开发笔记(五)关于事件Event

    我前面几篇博客中提到过.net中的事件与Windows事件的区别,本文讨论的是前者,也就是我们代码中经常用到的Event,感兴趣的朋友可以了解下
    2013-01-01
  • 浅谈Unity中的Shader

    浅谈Unity中的Shader

    Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在。Shader其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果
    2021-06-06
  • C# Winform使用log4net进行日志记录

    C# Winform使用log4net进行日志记录

    Log4Net是从Java的log4j移植过来的,功能也与log4j类似,可以把日志信息输出到文件、数据库等不同的介质或目标,下面我们就来学习一下如何使用log4net进行日志记录吧
    2023-11-11
  • C# 异步返回类型的几种方式

    C# 异步返回类型的几种方式

    异步编程已经成为一种重要的编程范式,本文主要介绍了C#异步返回类型的几种方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • C#自定义Key类型的字典无法序列化的解决方案详解

    C#自定义Key类型的字典无法序列化的解决方案详解

    当我们使用System.Text.Json.JsonSerializer对一个字典对象进行序列化的时候,默认情况下字典的Key不能是一个自定义的类型,本文整理了几种解决方案,希望对大家有所帮助
    2024-03-03

最新评论