
引擎:CocoCreator2.1.0
語言:TypeScript
Git倉庫地址:https://github.com/superXfx/GameDesignPatterns.git
定義——
封裝算法,并可在運行時切換,切算法的變化獨立于其的使用者。
此demo中使用 策略模式 來處理英雄“變身”時兩種不同的移動邏輯。
即Move行為獨立于Hero,將Move于Hero解耦,并可以在運行時切換。
類圖——

從類圖中可以發(fā)現,從MoveBehavior類派生出MoveNormal和MoveRotation兩個Move的具體類。
Hero持有MoveBehavior的引用并可在運行時用具體類賦值它,從而切換行為。
接下來看看代碼具體實現
1、基類 MoveBehavior

2、派生類,MoveNormal,MoveRotation


從代碼可以看出:
1>update()方法是move行為真正執(zhí)行的地方,派生類繼承并實現update來實現自己的move行為。
2>setDir(dir)方法則是設置移動方向
3>至于packParam(),unPackParam(dt)比較有趣,它是用來在切換行為時,“繼承”上一個行為的參數用的。
在這里就是dir參數,即切換move行為后保持方向不變
接下來看看move行為的擁有者Hero,以及對Move行為的具體使用方法。


1>首先Hero持有一個Move行為的引用,即MoveBehavior,顯而易見。
2>在changeHero中會動態(tài)的切換Move行為,
即this.mMoveInterface = new MoveNormal(this); 或 this.mMoveInterface = new MoveRotation(this);
非常簡單,簡潔優(yōu)雅的就改變了Hero的行為。
另外切換前使用packParam(),unPackParam(data)傳遞參數。
3>前面說過,真正的move行為在update中實現,那么在Hero的update中驅動Move行為的update即可。
至此,策略模式 在Hero移動上的應用已經全部完成,可以發(fā)現兩個很棒的優(yōu)點:
1、Move行為與Hero解耦。
這意味著Move行為可以應用在任何可移動體上。比如敵人甚至炮彈上。
2、當有新的Move行為時,可以做到“對擴展開放,對修改關閉”原則
只需實現一個新的行為類——此處是擴展開放。
而不需要修改任何現有代碼——此處是對修改關閉。
下一篇,游戲設計模式 之 觸發(fā)器
http://www.itdecent.cn/p/8427617be61e