読者です 読者をやめる 読者になる 読者になる

kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

Template Method パターン

Swift デザインパターン

https://ja.wikipedia.org/wiki/Template_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

f:id:kanetai:20150908015854p:plain

ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せる。

swiftでの実装例

今のところ、protectedabstractも無い。abstract methodに相当する部分は異常終了するようにしおいてサブクラスでoverrideしてもらう。

Apple Swift version 1.2 (swiftlang-602.0.53.1 clang-602.0.53)
Target: x86_64-apple-darwin14.5.0
class TaggedMessage {
    func taggedMessage(msg: String) -> String { return openingTag() + msg + closingTag() }
    func openingTag() -> String { return abend()! }
    func closingTag() -> String { return abend()! }
    func abend() -> String? { println("pleeeeeease override!!!!!"); return nil }
}
class ItalicMessage : TaggedMessage {
    override func openingTag() -> String { return "<i>" }
    override func closingTag() -> String { return "</i>" }
}
class AlertMessage : TaggedMessage {
    override func openingTag() -> String { return "<font size=\"30\" color=\"#ff0000\">" }
    override func closingTag() -> String { return "</font>" }
}

for obj: TaggedMessage in [ItalicMessage(), AlertMessage()] {
    println(obj.taggedMessage("message!"))
}
TaggedMessage().taggedMessage("abend!")