Design Patterns Talk - Template Method Pattern

《大話設計模式》第 10 章 - 模板方法模式 的 Swift 實現。

問題

兩個學生抄試題,各自有不同的答案,試卷是相同的。

方案

當我們要完成在某個細節(jié)層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,我們通??紤]用模板方法模式來處理。

所有重復的代碼都上升到父類去,而不是讓每個子類都去重復。把試題中相同的部分提煉到一個抽象類中。在用 Swift 實現時可以運用 Swift 的特性,把這個抽象類(模板)拆分成一個 protocol 和這個 protocol 的 extension。

1. AbstractClass:定義并實現一個模板方法。

這個模板方法一般是一個具體方法,它給出一個頂級邏輯的骨架。頂級邏輯也有可能調用一些具體方法。

protocol TestPaper{
    func answer1() -> String
    func answer2() -> String
    func answer3() -> String
}

extension TestPaper{
    func testQuestion1() {
        print("Question 1")
        print("Answer: \(answer1())")
    }
    
    func testQuestion2() {
        print("Question 2")
        print("Answer: \(answer2())")
    }
    
    func testQuestion3() {
        print("Question 3")
        print("Answer: \(answer3())")
    }
}

2. ConcreteClass:實現 protocol 所定義的方法

使得頂級邏輯的實現各不相同。

class TestPaperA: TestPaper{
    func answer1() -> String {
        return "b"
    }
    
    func answer2() -> String {
        return "c"
    }
    
    func answer3() -> String {
        return "a"
    }
}

class TestPaperB: TestPaper{
    func answer1() -> String {
        return "c"
    }
    
    func answer2() -> String {
        return "a"
    }
    
    func answer3() -> String {
        return "a"
    }
}

測試

print("Test Paper A:")
let a = TestPaperA()
a.testQuestion1()
a.testQuestion2()
a.testQuestion3()
print("\nTest Paper B:")
let b = TestPaperB()
b.testQuestion1()
b.testQuestion2()
b.testQuestion3()

總結

模板方法:定義一個操作中的算法骨架,將一些步驟延遲到子類中。模板方法可以使子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。

模板方法通過把不變的行為搬移到超類,去除子類中的重復代碼來體現它的優(yōu)勢。它提供了一個很好的代碼復用平臺。

playground

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,346評論 4 61
  • 就在中秋節(jié)前夜,涼可為了扶住快要摔倒的黎蓉,手肘碰倒了自己的玻璃杯。杯子從課桌經過短短五六十厘米的距離落在地上,裝...
    解羽慕蒼垠閱讀 486評論 0 1
  • 鳥兒沒有迷失時,可以沖著高處的白云飛,可以沖著遠處的朝霞飛,可以沖著前方的大樹飛,每一個向往的地方,鳥兒都飛的意氣...
    灼兮閱讀 237評論 0 0
  • 在當前的課堂學習中,知識學習依然是教學的重心,學習內容設計需要指向知識中心的學習環(huán)境,它與學習科學所指的學習者中心...
    信息技術教育應用閱讀 417評論 0 2

友情鏈接更多精彩內容