swiftでデザインパターンを実装(Adapterパターン:委譲)

Adapterパターン:委譲

前回に引き続きAdapterパターンを実装していきます。 今回は委譲を使った手法です。 この手法はAdapterクラスがTargetクラスを継承し、メンバ変数にAdapteeクラスを持つことによって実現します。

案件

登場人物

  • Adaptee(MizukiNana)
    • 水樹奈々さん。既存のクラス。今までどおり歌って、演技をしていきたい。
  • Target(Kohaku)
    • 紅白歌合戦に出場するために継承しなければならないクラス。kohaku()が定義されている。
  • Adapter(NanaMizuki)

実装(Playground)

// Adaptee
class MizukiNana {
    func perform() {
        print("演技する")
    }
    func sing() {
        print("歌う")
    }
}

// Target
class Kohaku {
    func kohaku() {
        fatalError("サブクラスで使ってね")
    }
}

// Adapter
class KohakuMizuki: Kohaku {
    private let mizukiNana = MizukiNana()
    
    override func kohaku() {
        mizukiNana.sing() //委譲
    }

    func engi(){
        mizukiNana.perform()
    }
    
}

let nana = KohakuMizuki()
nana.kohaku()
nana.engi()

結果

無事、奈々さんは普段通り演技もできて、紅白に出場するためのクラスを継承することができた。

感想

2回に分けてAdapterパターンを実装してきたわけですが、実装手法の「継承」や「委譲」は、

  • AdapterクラスがAdapteeクラスを継承する
  • AdapterクラスがAdapteeクラスに委譲する という文脈で使われていると気付きました。

次回はAdapterパターンのもう少し実践的な実装(紅白出場歌手を水樹奈々さんではなくラブライブに変更したい場合)やOSSでどのように使われているのかを調査したいと思います。