Swiftでデザインパターン アダプターパターン


アダプターパターン

クラスが既にある状態で、それに手を加えずに実装を追加する方法
既存のクラスに手を加えないので、非破壊的な実装ができる

前提事項

  • sayHelloの こんにちは の最後に、 ! を付け足したい要望がきた場合
  • 他の箇所でも使われているため、直接修正はできない

class Person { // 既存のクラス
    func sayHello() -> String {
        return "こんにちは"
    }
}

アダプターパターンを使う(継承バージョン)


protocol ShoutProtocol {
    func shout() -> String
}

class LoudVoicePerson : Person, ShoutProtocol {
    func shout() -> String {
        return super.sayHello() + "!"
    }
}

let loudVoicePerson = LoudVoicePerson()
print(loudVoicePerson.shout())

これでできました。既存のクラスに影響がないため、安全です(リリース間際でも心配しなくてすみます)

ただ、個人的には継承を使うやり方はswiftらしくないと思っており、下記のextensionを使ったほうが好きです。

// extensionを使って、このように実行することも可能

 extension Person : ShoutProtocol {
    func shout() -> String {
        return super.sayHello() + "!"
    }
 }