四畳半の秘密基地

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

MENU

Kotlinとスプラトゥーンで学ぶデザインパターン【2. Visitor】

なんとか第二回もできました!
今回はAdapterパターンです。

Adapterパターンとは

デザパタ本には

「すでに提供されているもの」と「必要なもの」の間の「ずれ」を埋めるデザインパターン

とあります。この通りなんですが、じゃあスプラトゥーンでこのパターンが使えそうな所はあるかなぁと考えました中々思いつかず。

やっと思いついたのがスプラトゥーン2のローラーの攻撃方法の変更でした。
1では横振りのみでしたが、2ではタテ振りという概念が追加されました。
この差をAdapterパターンで埋めてみることにしました。

実装

まず、1のときの実装は以下のようになっています。

val roller : SplaRoller = SplaRoller()
println(roller.swing())

ローラークラスの詳細は以下

open class SplaRoller {
    fun swing():String {
        return "Swing!"
    }
}

出力結果

Swing!

ただ振るのみ。
次に2のローラーの実装は以下のようにメソッドを呼び出せる想定で実装します。

val newRoller : SplaRoller2 = NewSplaRoller()
println(newRoller.swingHorizontal())
println(newRoller.swingVertical())

そのために必要なものが、まずは2仕様のインターフェース

SplaRoller2.kt

interface SplaRoller2 {
    fun swingHorizontal(): String
    fun swingVertical(): String
}

旧仕様と新仕様を繋ぐクラス
NewSplaRoller.kt

class NewSplaRoller : SplaRoller(), SplaRoller2 {
    override fun swingHorizontal(): String {
        return "Horizontal " + swing()
    }

    override fun swingVertical(): String {
        return "Vertical " + swing()
    }

}

出力結果

Horizontal Swing!
Vertical Swing!

という感じです。ちなみに縦振り・横振りは振り始めにジャンプしているか否かで判定されるようです!

実装してみて

実装パターンをパッと見た所、クラス・インターフェースが冗長な感じがしました。
元の実装をそのとき必要な実装に合わせるだけならSplaRollerクラスを継承してSplaRoller2を作るという方が簡単ではないかと。
でもよくよく考えると、単純に継承するだけだとSplaRollerクラスが変更された時に影響を受けやすい気がします。できるだけ疎結合にしておくという意味でやはり間に継承or移譲するクラスを挟んだ方が良さそうという結論に至りました。

蛇足

気になっていたダイナモの縦振りやはり存在するようですね。
ローラーですら相当な飛距離なのでダイナモならどんだけ飛ぶんだよ!とか楽しみにしてます。
想像では、ダイナモの縦振り=Fateアーサー王エクスカリバーです。