四畳半の秘密基地

さあ、今日はどんな実験をしよう

MENU

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

感想

Javaの入門書を読んでる頃、抽象クラスとかインターフェースとか何に使うのだろう?とずっと疑問で、
業務でもあまり使わないで実装してましたがデザインパターンを学ぶと使い所が見えてくる気がします。