Unity游戲開發(fā)中的設(shè)計(jì)模式之策略模式
一、使用策略模式的原因
在設(shè)計(jì)游戲角色傷害時(shí),因角色差異而使用不同的計(jì)算公式,如何解決,同一計(jì)算方式分布在不同的角色中、新增角色增加維護(hù)等問(wèn)題,可以使用策略模式解決。
二、策略模式的定義
GoF對(duì)策略模式的解釋:定義一組算法,并封裝每個(gè)算法,讓它們可以彼此交換使用。策略模式讓這些算法在客戶端使用它們時(shí)能更加獨(dú)立。
策略模式在處理所謂的“算法時(shí)”,著重于細(xì)節(jié),至于計(jì)算方式及規(guī)則,則不用去理會(huì)。
三、策略模式的使用說(shuō)明
參與者說(shuō)明:
- Strategy(策略接口類):提供“策略客戶端”可以使用的方法。
- ConcreteStrategyA~C(策略實(shí)現(xiàn)類): 不同算法的實(shí)現(xiàn)。
- Context(策略客戶端):擁有一個(gè)Strategy類的對(duì)象引用,并且通過(guò)對(duì)象引用獲取想要的計(jì)算結(jié)果。
四、策略模式的實(shí)現(xiàn)范例
算法的共享接口:
/// <summary> /// 算法的共享接口 /// </summary> public abstract class Strategy { public abstract void AlgorithmInterface(); }
實(shí)現(xiàn)各種算法:
/* 各類算法的實(shí)現(xiàn) */ /// <summary> /// 算法 A /// </summary> public class ConcreteStrategyA : Strategy { public override void AlgorithmInterface() { //print } } /// <summary> /// 算法 B /// </summary> public class ConcreteStrategyB : Strategy { public override void AlgorithmInterface() { //print } } /// <summary> /// 算法 C /// </summary> public class ConcreteStrategyC : Strategy { public override void AlgorithmInterface() { //print } }
擁有Strategy對(duì)象的客戶端
/// <summary> /// 擁有Strategy 對(duì)象的客戶端 /// </summary> public class Context { Strategy strategy = null; /// <summary> /// 設(shè)置算法 /// </summary> /// <param name="strategy"></param> public void SetStrategy(Strategy strategy) { strategy = strategy; } /// <summary> ///執(zhí)行當(dāng)前的算法 /// </summary> public void ContextInterface() { strategy.AlgorithmInterface(); } }
五、中介者模式的優(yōu)點(diǎn)和注意事項(xiàng)
優(yōu)點(diǎn):
- 讓角色屬性變得好維護(hù);
- 不必在針對(duì)角色類型編寫程序代碼;
- 計(jì)算公式的替換更為方便;
缺點(diǎn):
計(jì)算公式時(shí)的參數(shù)設(shè)置,需要外界提供相關(guān)信息作為計(jì)算依據(jù);
與狀態(tài)模式的差別:
都?xì)w類在行為模式(Behavior Patterns)分類下,都由一個(gè)Context類來(lái)維護(hù)對(duì)象的引用。
- 差異: State是在一群狀態(tài)中進(jìn)行切換,狀態(tài)之間有對(duì)應(yīng)和連接的關(guān)系,而Strategy是由一群沒(méi)有任何關(guān)系的類組成,不知彼此的存在。
- State受限于狀態(tài)機(jī)的切換規(guī)則,在設(shè)計(jì)初期就可能定義所有狀態(tài),后期追加,不是想加入就加入,受限于現(xiàn)有狀態(tài)關(guān)聯(lián);而Strategy是由封裝計(jì)算算法而形成的一種設(shè)計(jì)模式,算法之間不存在任何依賴關(guān)系,可以隨時(shí)加入。
六、策略模式的總結(jié)
將復(fù)雜的計(jì)算公式從客戶端中獨(dú)立出來(lái)稱為一個(gè)群組,之后客戶端可以按照情況來(lái)決定使用的計(jì)算公式策略,既提高系統(tǒng)應(yīng)用的靈活程度,也強(qiáng)化了系統(tǒng)中對(duì)所有計(jì)算策略的維護(hù)方式。
后續(xù)開發(fā)人員很容易找到相關(guān)計(jì)算公式的差異,同時(shí)修改點(diǎn)也會(huì)縮小到計(jì)算公式本身,也不會(huì)影響到使用的客戶端。
到此這篇關(guān)于Unity游戲開發(fā)中的設(shè)計(jì)模式之策略模式的文章就介紹到這了,更多相關(guān)Unity策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#擴(kuò)展datatable轉(zhuǎn)json示例
這篇文章主要介紹了c#擴(kuò)展datatable轉(zhuǎn)json示例,需要的朋友可以參考下2014-05-05詳解如何通過(guò)wireshark實(shí)現(xiàn)捕獲C#上傳的圖片
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)wireshark實(shí)現(xiàn)捕獲C#上傳的圖片,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11C#實(shí)現(xiàn)字母與ASCII碼互相轉(zhuǎn)換
ASCII是基于拉丁字母的編碼系統(tǒng),也是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),本文主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)字母與ASCII碼互轉(zhuǎn),需要的可以參考下2024-01-01關(guān)于C#中ajax跨域訪問(wèn)問(wèn)題
最近做項(xiàng)目,需要跨域請(qǐng)求訪問(wèn)數(shù)據(jù)問(wèn)題。下面通過(guò)本文給大家分享C#中ajax跨域訪問(wèn)代碼詳解,需要的朋友可以參考下2017-05-05