Unity游戲開發(fā)中的中介者模式的應(yīng)用與實現(xiàn)
一、使用中介者模式的原因
隨著項目功能越多,系統(tǒng)切分越細(xì),系統(tǒng)之間的溝通越復(fù)雜,這時系統(tǒng)內(nèi)部如果一直保存這種狀態(tài),就會產(chǎn)生如下缺點:
- 單一系統(tǒng)引入太多其他系統(tǒng)的功能,不利于單一系統(tǒng)的轉(zhuǎn)換和維護(hù);
- 單一系統(tǒng)被過多的系統(tǒng)所依賴,不利于接口的更改,容易牽一發(fā)而動全身;
- 因為需提供給其他系統(tǒng)操作,系統(tǒng)的接口可能過于龐大,不容易維護(hù);
要解決上述問題,可以使用中介者模式的設(shè)計方法。
二、中介者模式的定義
中介者模式簡單解釋的話,比較類似于中央管理的概念:建一個信息集中的中心,任何子系統(tǒng)要與它的子系統(tǒng)溝通時,都必須先將請求交給中央單位,再由中央單位分配給對應(yīng)的子系統(tǒng)。
中介者模式在GoF中的說明:定義一個接口用來封裝一群對象的互動行為。中介者通過移除對象之間的引用,來減少它們之間的耦合度,并且能改變它們之間的互動獨立性。
三、中介者模式的使用說明
創(chuàng)建一個中介者模式的結(jié)構(gòu)如圖:

其中的參與者如下:
Colleague(同事接口)
- 擁有一個Mediator屬性成員,可以通過它來調(diào)用中介的功能。
ConcreteColleagueX(同事接口實現(xiàn)類)
- 實現(xiàn)Colleague界面的類,對于單一實現(xiàn)類而言,只會依賴一個Mediator接口。
Mediator(中介者接口)、ConcreteMediator(中介者接口實現(xiàn)類)
- 由Mediator定義讓Colleague類操作的接口。
- ConcreteMediator實現(xiàn)類中包含所有ConcreteColleague的對象引用。
- ConcreteMediator類之間的互動會在ConcreteMediator中發(fā)生。
介紹一個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 ,用來指向中介者,而這個中介者會在建造者中被指定。
實現(xiàn)各Colleague類:
public class ConcreteColleague1:Colleague
{
public ConcreteColleague1(Mediator mediator):base(mediator)
{
}
/// <summary>
/// 執(zhí)行動作
/// </summary>
public void Action()
{
//執(zhí)行后需要通知其他Colleague
mediator.SendMessage(this, "Colleage1 發(fā)出通知");
}
/// <summary>
/// Mediator 通知請求
/// </summary>
/// <param name="message"></param>
public override void Request(string message)
{
}
}
public class ConcreteColleague2:Colleague
{
public ConcreteColleague2(Mediator mediator):base(mediator)
{
}
/// <summary>
/// 執(zhí)行動作
/// </summary>
public void Action()
{
//執(zhí)行后需要通知其他Colleague
mediator.SendMessage(this, "Colleage2 發(fā)出通知");
}
/// <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。
最后,實現(xiàn)ConcreteMediator類,該類擁有所有“要在內(nèi)部進(jìn)行溝通的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);
}
}實現(xiàn)中介者模式的測試:
public class MediatorTest
{
public void UnitTest()
{
//產(chǎn)生中介者
ConcreteMediator concreteMediator = new ConcreteMediator();
//產(chǎn)生兩個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)點和注意事項
中介者模式具備以下優(yōu)點:
不會引入太多其他的系統(tǒng); 系統(tǒng)被依賴的程度也降低;
注意事項:
1、在某些情況下會出現(xiàn)中介者類擔(dān)任過多中介者角色而產(chǎn)生“操作接口爆炸”的情況,這時需要配合其他設(shè)計模式來處理。
2、中介者接口沒有繼承任何接口類。這樣對于所有游戲系統(tǒng)和玩家界面而言,它們所依賴的將是“接口”而不是“實現(xiàn)”,這樣會更符合開—閉原則(OCP),從而提高游戲系統(tǒng)和玩家界面的可移植性。
總結(jié):
中介者模式的優(yōu)點是能讓系統(tǒng)之間的耦合度降低,提升系統(tǒng)的可維護(hù)性。但身為模式中的中介者角色類,也會存在接口過大的風(fēng)險,此時必須配合其他模式來進(jìn)行優(yōu)化。
到此這篇關(guān)于Unity游戲開發(fā)中的中介者模式的應(yīng)用與實現(xiàn)的文章就介紹到這了,更多相關(guān)Unity中介者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中按引用傳遞與按值傳遞的區(qū)別,以及ref與out關(guān)鍵字的用法詳解
以下是對C#中按引用傳遞與按值傳遞的區(qū)別,以及ref與out關(guān)鍵字的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07
C#彈出對話框確定或者取消執(zhí)行相應(yīng)操作的實例代碼
這篇文章主要介紹了C#彈出對話框確定或者取消執(zhí)行相應(yīng)操作的實例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
c#動態(tài)編譯執(zhí)行對象方法示例 運用映射機制創(chuàng)建對象
本示例核心技術(shù)是運用.NET動態(tài)編譯技術(shù)+.NET映射技術(shù),把一個代碼塊中的代碼,動態(tài)編譯成程序集后,在運用映射機制,創(chuàng)建對象示例,調(diào)用對象方法2014-01-01
C#調(diào)用C動態(tài)鏈接庫的實現(xiàn)
動態(tài)鏈接庫是不能直接執(zhí)行的,也不能接收消息,它只是一個獨立的文件,本文主要介紹了C#調(diào)用C動態(tài)鏈接庫的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01
C# dump系統(tǒng)lsass內(nèi)存和sam注冊表詳細(xì)
這篇文章主要介紹了C# dump系統(tǒng)lsass內(nèi)存和sam注冊表,在這里選擇 C# 的好處是體積小,結(jié)合 loadAssembly 方便免殺,希望對讀者們有所幫助2021-09-09

