一、模板方法(Template Method)模式
准備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模版方法模式的用意。
很多人可能沒有想到,模版方法模式實際上是所有模式中最為常見的幾個模式之一,而且很多人可能使用過模版方法模式而沒有意識到自己已經使用了這個模式。模版方法模式是基於繼承的代碼復用的基本技術,模版方法模式的結構和用法也是面向對象設計的核心。
模版方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個算法的輪廓和骨架,另一些設計師則負責給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本法方法總匯起來的方法叫做模版方法(template method),這個設計模式的名字就是從此而來。
二、模版方法模式的結構
模版方法模式的靜態結構如下圖所示。
這裡涉及到兩個角色:
抽象模版(AbstractClass)角色有如下的責任:
定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。
定義並實現了一個模版方法。這個模版方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。
具體模版(ConcreteClass)角色有如下的責任:
實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。
每一個抽象模版角色都可以有任意多個具體模版角色與之對應,而每一個具體模版角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同