欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity游戲開(kāi)發(fā)中的中介者模式的應(yīng)用與實(shí)現(xiàn)

 更新時(shí)間:2023年05月05日 10:31:48   作者:iukam  
中介者模式是Unity游戲開(kāi)發(fā)中常用的設(shè)計(jì)模式之一,用于減少對(duì)象之間的直接耦合,通過(guò)引入中介者來(lái)協(xié)調(diào)對(duì)象之間的交互。通過(guò)中介者模式,游戲?qū)ο罂梢愿屿`活地進(jìn)行交互和協(xié)同工作,降低系統(tǒng)復(fù)雜度,使代碼更加易于維護(hù)和擴(kuò)展

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

隨著項(xiàng)目功能越多,系統(tǒng)切分越細(xì),系統(tǒng)之間的溝通越復(fù)雜,這時(shí)系統(tǒng)內(nèi)部如果一直保存這種狀態(tài),就會(huì)產(chǎn)生如下缺點(diǎn):

  • 單一系統(tǒng)引入太多其他系統(tǒng)的功能,不利于單一系統(tǒng)的轉(zhuǎn)換和維護(hù);
  • 單一系統(tǒng)被過(guò)多的系統(tǒng)所依賴(lài),不利于接口的更改,容易牽一發(fā)而動(dòng)全身;
  • 因?yàn)樾杼峁┙o其他系統(tǒng)操作,系統(tǒng)的接口可能過(guò)于龐大,不容易維護(hù);

要解決上述問(wèn)題,可以使用中介者模式的設(shè)計(jì)方法。

二、中介者模式的定義

中介者模式簡(jiǎn)單解釋的話,比較類(lèi)似于中央管理的概念:建一個(gè)信息集中的中心,任何子系統(tǒng)要與它的子系統(tǒng)溝通時(shí),都必須先將請(qǐng)求交給中央單位,再由中央單位分配給對(duì)應(yīng)的子系統(tǒng)。

中介者模式在GoF中的說(shuō)明:定義一個(gè)接口用來(lái)封裝一群對(duì)象的互動(dòng)行為。中介者通過(guò)移除對(duì)象之間的引用,來(lái)減少它們之間的耦合度,并且能改變它們之間的互動(dòng)獨(dú)立性。

三、中介者模式的使用說(shuō)明

創(chuàng)建一個(gè)中介者模式的結(jié)構(gòu)如圖:

其中的參與者如下:

Colleague(同事接口)

  • 擁有一個(gè)Mediator屬性成員,可以通過(guò)它來(lái)調(diào)用中介的功能。

ConcreteColleagueX(同事接口實(shí)現(xiàn)類(lèi))

  • 實(shí)現(xiàn)Colleague界面的類(lèi),對(duì)于單一實(shí)現(xiàn)類(lèi)而言,只會(huì)依賴(lài)一個(gè)Mediator接口。

Mediator(中介者接口)、ConcreteMediator(中介者接口實(shí)現(xiàn)類(lèi))

  • 由Mediator定義讓Colleague類(lèi)操作的接口。
  • ConcreteMediator實(shí)現(xiàn)類(lèi)中包含所有ConcreteColleague的對(duì)象引用。
  • ConcreteMediator類(lèi)之間的互動(dòng)會(huì)在ConcreteMediator中發(fā)生。

介紹一個(gè)GoF范例程序如下:

Colleague(同事接口)

  public abstract class Colleague
    {
        protected Mediator mediator = null;//通過(guò)Mediator對(duì)外溝通
        public Colleague(Mediator mediator)
        {
            this.mediator = mediator;
        }
        /// <summary>
        /// Mediator 請(qǐng)求通知
        /// </summary>
        public abstract void Request(string message);
    }

Colleague為抽象類(lèi),擁有一個(gè)類(lèi)型為Mediator的屬性成員mediator ,用來(lái)指向中介者,而這個(gè)中介者會(huì)在建造者中被指定。

實(shí)現(xiàn)各Colleague類(lèi):

public class ConcreteColleague1:Colleague
    {
        public ConcreteColleague1(Mediator mediator):base(mediator)
        {
        }
        /// <summary>
        /// 執(zhí)行動(dòng)作
        /// </summary>
        public void Action()
        {
            //執(zhí)行后需要通知其他Colleague
            mediator.SendMessage(this, "Colleage1 發(fā)出通知");
        }
        /// <summary>
        /// Mediator 通知請(qǐng)求
        /// </summary>
        /// <param name="message"></param>
        public override void Request(string message)
        {
        }
    }
    public class ConcreteColleague2:Colleague
    {
        public ConcreteColleague2(Mediator mediator):base(mediator)
        {
        }
        /// <summary>
        /// 執(zhí)行動(dòng)作
        /// </summary>
        public void Action()
        {
            //執(zhí)行后需要通知其他Colleague
            mediator.SendMessage(this, "Colleage2 發(fā)出通知");
        }
        /// <summary>
        /// Mediator 通知請(qǐng)求
        /// </summary>
        /// <param name="message"></param>
        public override void Request(string message)
        {
        }
    }

每一個(gè)繼承自Colleague的ConcreteColleagueX類(lèi),需要對(duì)外界溝通時(shí),都會(huì)通過(guò)mediator來(lái)傳遞信息。

Mediator接口,用來(lái)管理Colleague對(duì)象的接口:

    public abstract class Mediator
    {
        public abstract void SendMessage(Colleague colleague, string message);
    }

Mediator定義了一個(gè)抽象方法SendMessage(),主要用于從外界傳遞信息給Colleague。

最后,實(shí)現(xiàn)ConcreteMediator類(lèi),該類(lèi)擁有所有“要在內(nèi)部進(jìn)行溝通的Colleague子類(lèi)的引用”:

    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>
        /// 收到來(lái)自Colleague請(qǐng)求
        /// </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);
        }
    }

實(shí)現(xiàn)中介者模式的測(cè)試:

public class MediatorTest
    {
        public void UnitTest()
        {
            //產(chǎn)生中介者
            ConcreteMediator concreteMediator = new ConcreteMediator();
            //產(chǎn)生兩個(gè)Colleague
            ConcreteColleague1 colleague1 = new ConcreteColleague1(concreteMediator);
            ConcreteColleague2 colleague2 = new ConcreteColleague2(concreteMediator);
            //設(shè)置給中介者
            concreteMediator.SetColleague1(colleague1);
            concreteMediator.SetColleague2(colleague2);
            //執(zhí)行
            colleague1.Action();
            colleague2.Action();
        }
    }

四、中介者模式的優(yōu)點(diǎn)和注意事項(xiàng)

中介者模式具備以下優(yōu)點(diǎn):

不會(huì)引入太多其他的系統(tǒng); 系統(tǒng)被依賴(lài)的程度也降低;

注意事項(xiàng):

1、在某些情況下會(huì)出現(xiàn)中介者類(lèi)擔(dān)任過(guò)多中介者角色而產(chǎn)生“操作接口爆炸”的情況,這時(shí)需要配合其他設(shè)計(jì)模式來(lái)處理。

2、中介者接口沒(méi)有繼承任何接口類(lèi)。這樣對(duì)于所有游戲系統(tǒng)和玩家界面而言,它們所依賴(lài)的將是“接口”而不是“實(shí)現(xiàn)”,這樣會(huì)更符合開(kāi)—閉原則(OCP),從而提高游戲系統(tǒng)和玩家界面的可移植性。

總結(jié):

中介者模式的優(yōu)點(diǎn)是能讓系統(tǒng)之間的耦合度降低,提升系統(tǒng)的可維護(hù)性。但身為模式中的中介者角色類(lèi),也會(huì)存在接口過(guò)大的風(fēng)險(xiǎn),此時(shí)必須配合其他模式來(lái)進(jìn)行優(yōu)化。

到此這篇關(guān)于Unity游戲開(kāi)發(fā)中的中介者模式的應(yīng)用與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Unity中介者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法

    C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法,可實(shí)現(xiàn)系統(tǒng)服務(wù)的啟動(dòng)和停止功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • WinForm實(shí)現(xiàn)自定義右下角提示效果的方法

    WinForm實(shí)現(xiàn)自定義右下角提示效果的方法

    這篇文章主要介紹了WinForm實(shí)現(xiàn)自定義右下角提示效果的方法,涉及WinForm自定義提示效果的實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    這篇文章主要介紹了設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用,理論上來(lái)說(shuō)組合模式包含抽象構(gòu)件、樹(shù)葉構(gòu)件和樹(shù)枝構(gòu)件三個(gè)角色,需要的朋友可以參考下
    2016-02-02
  • c# 面試必備線程基礎(chǔ)知識(shí)點(diǎn)

    c# 面試必備線程基礎(chǔ)知識(shí)點(diǎn)

    這篇文章主要介紹了c# 面試必備線程基礎(chǔ)知識(shí)點(diǎn),幫助大家更好的鞏固,掌握線程的基礎(chǔ)知識(shí),感興趣的朋友可以了解下
    2020-11-11
  • C#中的遞歸APS和CPS模式詳解

    C#中的遞歸APS和CPS模式詳解

    這篇文章主要介紹了C#中的遞歸APS和CPS模式詳解,本文講解了累加器傳遞模式、CPS函數(shù)、CPS變換、CPS尾遞歸、尾遞歸與Continuation等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • .Net WInform開(kāi)發(fā)筆記(五)關(guān)于事件Event

    .Net WInform開(kāi)發(fā)筆記(五)關(guān)于事件Event

    我前面幾篇博客中提到過(guò).net中的事件與Windows事件的區(qū)別,本文討論的是前者,也就是我們代碼中經(jīng)常用到的Event,感興趣的朋友可以了解下
    2013-01-01
  • 淺談Unity中的Shader

    淺談Unity中的Shader

    Shader,中文名為著色器,對(duì)很多開(kāi)發(fā)者來(lái)說(shuō)它是一個(gè)神秘的存在。Shader其實(shí)就是專(zhuān)門(mén)用來(lái)渲染圖形的一種技術(shù),通過(guò)shader,我們可以自定義顯卡渲染畫(huà)面的算法,使畫(huà)面達(dá)到我們想要的效果
    2021-06-06
  • C# Winform使用log4net進(jìn)行日志記錄

    C# Winform使用log4net進(jìn)行日志記錄

    Log4Net是從Java的log4j移植過(guò)來(lái)的,功能也與log4j類(lèi)似,可以把日志信息輸出到文件、數(shù)據(jù)庫(kù)等不同的介質(zhì)或目標(biāo),下面我們就來(lái)學(xué)習(xí)一下如何使用log4net進(jìn)行日志記錄吧
    2023-11-11
  • C# 異步返回類(lèi)型的幾種方式

    C# 異步返回類(lèi)型的幾種方式

    異步編程已經(jīng)成為一種重要的編程范式,本文主要介紹了C#異步返回類(lèi)型的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C#自定義Key類(lèi)型的字典無(wú)法序列化的解決方案詳解

    C#自定義Key類(lèi)型的字典無(wú)法序列化的解決方案詳解

    當(dāng)我們使用System.Text.Json.JsonSerializer對(duì)一個(gè)字典對(duì)象進(jìn)行序列化的時(shí)候,默認(rèn)情況下字典的Key不能是一個(gè)自定義的類(lèi)型,本文整理了幾種解決方案,希望對(duì)大家有所幫助
    2024-03-03

最新評(píng)論