[Design Pattern] 樣板方法 (Template Method )

Andy Lu
Mar 19, 2021

--

使用 Kotlin 示範

Photo by Phil Botha on Unsplash

目的

在同一個層級的類別中,如果有方法的操作是類似的,可以將相同的的部分抽出至新類別裡,並把需要變動的部分保留在原本的類別中。

也就是說,將演算法的骨架定義在父類別中,然後在子類別覆寫部分函數。

模式

行為模式 (Behavioral pattern)

架構圖

  • ParentClass 為一抽象類別
  • ParentClass 中的 execute() 為樣板方法。分別呼叫了 method1(), method2(), method3()
  • 其中, method2() 為一個抽象方法。
  • Class1 以及 Class2 分別實作各自的 method2() 邏輯。

範例

假設有兩個 Class 包含了“類似”的操作: Class1execute() 接連呼叫了 metho1()->method2A()->methodC();Class2execute() 接連呼叫了 metho1()->method2B()->methodC()

我們發現,這兩個類別的 execute() 呼叫,只有 method2A()method2B() 不同,其他部分都相同,所以我們可以使用 Template Method 來將相同部分抽至 ParentClass()

重構

  1. execute() 方法抽至 ParentClass 中,
  2. method1() , method3() 方法搬至 ParentClass 內。
  3. ParentClass 中新增 一 abstract method: method2()
  4. ParentClass 內的 execute() 方法按照原本的順序排列。
  5. Class1Class2 繼承 ParentClass
  6. Class1Class2method2A()method2B() 改名為 method2() 並加上 override 覆寫 ParentClass中的 abstract method:method2()。

心得

如同之前介紹的 Factory Method (工廠方法),同樣都是將類別中相同的部分搬移至父類別內,但與工廠方法不同的是,在樣板方法中,父類別是一個抽象類別,並且擁有一個樣板方法 (Template Method),在這個方法中,可以將演算法的架構定義在這邊,將共同的函式定義在父類別內,並且按照正確的順序來調用。子類別唯一做的是,就是把可變的部分自行處理掉,通常是一個抽象方法。

如果父類別定義一個抽象方法供子類別覆寫,那麼子類別必須要覆寫該抽象類別,否則該子類別也會成為抽象類別。

在樣板方法中,可能會擔心子類別覆寫父類別的抽象類別時,不小心也把樣板方法給覆寫了。在 Kotlin 中,除非在樣板方法前方加上 open ,否則子類別將不能任意的覆寫父類別的方法。

github: https://github.com/andyludeveloper/TemplateMethod_Kotlin/

如果你覺得本篇文章不錯,請拍手👏鼓勵我~

謝謝

參考資料

Design Patterns:物件導向設計模式

Refactoring to Patterns:重構與模式

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet