Kotlinとスプラトゥーンで学ぶデザインパターン【3. Template Method】
スプラトゥーン2発売日まで1ヶ月を切りました。
E3での大会、日本チームは惜しくも2位でしたが熱い試合でした。
今回はTemplate Methodパターンです。
Template Methodパターンとは
Template Methodパターンは、親クラスで処理の枠組みを決め、子クラスで具体的な処理を記述するデザインパターンです。
スプラトゥーンでこのデザインパターンが適用できるところがなかなか見つからなかったのですが
試合結果画面がナワバリとガチで違うことに気づき今回は試合結果画面を題材にすることにしました。(前提として勝った時しか考慮していません)
実装
まずナワバリバトルとガチバトルの違いを見極めます。
<ナワバリバトル>
- 左上のポイントは塗った面積、
- チームのリザルトにはランク、武器、名前、塗った面積
<ガチバトル>
- 左上のポイントはランクに応じてランクに応じて取得できるポイント
- チームのリザルトにはランク、武器、名前、腕前
が各々表示されます。
これらのことを考慮して実装するとイカのようになりました。
GameResult.kt
abstract class GameResult { abstract fun showScore(player: Player) abstract fun showTeamResult(players: Array<Player>) fun show(players: Array<Player>) { //一人目のプレイヤーが自分自身 showScore(players[0]) showTeamResult(players) } }
スコア表示、チーム表示メソッドを抽象化して具象クラスに任せています。
Player.kt
data class Player(val name: String, val rank: Int, val udemae: String, val score:Int, val wepon:String)
データクラス。
NawabariBattleResult.kt
class NawabariBattleResult: GameResult() { override fun showScore(player: Player) { println("" + player.score + "ポイント獲得しました!") } override fun showTeamResult(players: Array<Player>) { for (player in players) { println("" + player.rank + ", " + player.wepon + ", " + player.name + ", " + player.score) } } }
GachiBattleResult.kt
class GachiBattleResult : GameResult() { override fun showScore(player: Player) { println("" + getScoreByUdemae(player.udemae) + "ポイント獲得しました!") } override fun showTeamResult(players: Array<Player>) { for (player in players) { println(player.wepon + ", " + player.name + ", " + player.rank) } } //ノックアウトは考慮しない private fun getScoreByUdemae(udemae: String): Int { when (udemae) { "C-" -> return 1000 "C" -> return 1300 "C+" -> return 1600 "B-" -> return 2000 "B" -> return 2300 "B+" -> return 2600 "A-" -> return 3000 "A" -> return 3300 "A+" -> return 3600 "S" -> return 4000 else -> return 5000 } } }
具象クラスの実装は上記のようになりました。
呼び出すときはイカのように。
println("ナワバリバトルの結果") val nawabariResult: NawabariBattleResult = NawabariBattleResult() nawabariResult.show(players) println("\n\nガチバトルの結果") val gachiResult: GachiBattleResult = GachiBattleResult() gachiResult.show(players)
ソースはこちら
github.com