Swiftでデザインパターン テンプレートパターン


テンプレートパターン

  • アルゴリズムの骨組みを決めておき、実装はそれを継承したクラスで行う
  • 細かい実装を気にせず、protocolで呼び出しできるメリットが有る

前提

  • JapaneseManとEnglishManという2つのクラスがある
  • sayHelloというメソッドがあり、挨拶をそれぞれの国の言葉でできる
class JapaneseMan {
    func sayHello() -> String {
        return "こんにちは" // 日本語で返す
    }
}

class EnglishMan {
    func sayHello() -> String {
        return "Hello" // 英語で返す
    }
}

問題

  • 似たような関数であるsayHelloを使うのに、classが違うため、面倒
  • たとえ話ですが、arrayに無理やり入れようとするとAnyとなる
  • AnyではsayHelloを呼び出すことはできず、一度キャストする必要が出てくる

let peopleArray = [JapaneseMan, englishMan] as [Any]
peopleArray[0] // <- このときanyになる

テンプレートパターン

  • protocolで予め骨組みを作成し、各クラスで継承し、実装する
  • 配列で使うときなどはprotocolを指定して受け皿を作成し、利用する
  • こうすることで実装は気にせず、オブジェクトを抽象的に扱うことができる

protocol Greetings {
    func sayHello() -> String
}

extension JapaneseMan: Greetings {
    func sayHello() -> String {
        return "こんにちは" // 日本語で返す
    }
}

extension EnglishMan: Greetings {
    func sayHello() -> String {
        return "Hello" // 英語で返す
    }
}

let greetingsArray: [Greetings] = [japaneseMan, englishMan]
greetingsArray[0] // <- このときGreetingsになる
greetingsArray[0].sayHello()
greetingsArray[1].sayHello()