使用 Kotlin 示範
目的
在同一個層級的類別中,如果有方法的操作是類似的,可以將相同的的部分抽出至新類別裡,並把需要變動的部分保留在原本的類別中。
也就是說,將演算法的骨架定義在父類別中,然後在子類別覆寫部分函數。
模式
行為模式 (Behavioral pattern)
架構圖
ParentClass
為一抽象類別ParentClass
中的execute()
為樣板方法。分別呼叫了method1()
,method2()
,method3()
- 其中,
method2()
為一個抽象方法。 - 在
Class1
以及Class2
分別實作各自的method2()
邏輯。
範例
假設有兩個 Class 包含了“類似”的操作: Class1
的 execute()
接連呼叫了 metho1()->method2A()->methodC()
;Class2
的 execute()
接連呼叫了 metho1()->method2B()->methodC()
。
我們發現,這兩個類別的 execute()
呼叫,只有 method2A()
與 method2B()
不同,其他部分都相同,所以我們可以使用 Template Method 來將相同部分抽至 ParentClass()
。
重構
- 將
execute()
方法抽至ParentClass
中, - 將
method1()
,method3()
方法搬至ParentClass
內。 - 在
ParentClass
中新增 一 abstract method:method2()
。 - 將
ParentClass
內的 execute() 方法按照原本的順序排列。 - 把
Class1
及Class2
繼承ParentClass
。 - 把
Class1
及Class2
的method2A()
及method2B()
改名為method2()
並加上override
覆寫ParentClass
中的 abstract method:method2()。
心得
如同之前介紹的 Factory Method (工廠方法),同樣都是將類別中相同的部分搬移至父類別內,但與工廠方法不同的是,在樣板方法中,父類別是一個抽象類別,並且擁有一個樣板方法 (Template Method),在這個方法中,可以將演算法的架構定義在這邊,將共同的函式定義在父類別內,並且按照正確的順序來調用。子類別唯一做的是,就是把可變的部分自行處理掉,通常是一個抽象方法。
如果父類別定義一個抽象方法供子類別覆寫,那麼子類別必須要覆寫該抽象類別,否則該子類別也會成為抽象類別。
在樣板方法中,可能會擔心子類別覆寫父類別的抽象類別時,不小心也把樣板方法給覆寫了。在 Kotlin 中,除非在樣板方法前方加上 open
,否則子類別將不能任意的覆寫父類別的方法。
github: https://github.com/andyludeveloper/TemplateMethod_Kotlin/
如果你覺得本篇文章不錯,請拍手👏鼓勵我~
謝謝