本篇討論 template method 模式,我會涵括
一樣是電子商務系統的例子。假設今天有一項新需求:系統要能夠支援 Oracle 與 SQL Server 資料庫。雖然兩者都基於能夠使資料庫使用更加簡單的通用標準 SQL。但是兩個系統的細節仍然存在差別。
我們希望在上面的案例裡使用 template method 模式。首先先簡單介紹一下。
GoF 是如此說的:
(Template method 模式)定義一個操作中演算法的骨架,而將一些步驟延遲到子類別中。不改算演算法的結構而重定義它的步驟。
它提供了一種方式:在一個抽象類別中捕捉共同點,同時在衍生類別中封裝差異。Template method 模式能控制不同過程中共同的序列。
在這個案例中,我們將 template method 模式應用進去後的樣子如下。
有沒有這種經驗,因為要介接幾個不同部門的系統,他們所用的規則大致相同,但是有些細節的處理上不同。
在實作上,直覺可能會使用 if-else 語句去做系統的選擇;或是直接 copy-paste 。前者有可能會使程式碼變壞;後者會造成程式碼出現冗餘。
這時候可以引入此模式來去除重複與避免可能錯誤的細節。
引入有三步驟:
項目 | 內容 |
---|---|
意圖 | 定義一個操作中演算法的骨架。將一些步驟推遲到子類別。可以不改變演算法的結構而重定義該演算法的步驟 |
問題 | 要完成在某一細節層次一致的一個過程或一系列步驟,但其各別步驟在更詳細的層次上實作可能不同 |
解決方案 | 允許可變的子步驟,但基本過程保持一致 |
參與者與協作者 | 此模式由一個抽象類別組成,這個抽象類別定義了需要覆蓋的基本 TemplateMethod() 。每個從這個抽象類別衍生的具體類別將為此範本實作新方法 |
效果 | 範本提供了一個很好的程式碼再利用平台,確保所需步驟的實作。 |
實作 | 建立一個抽象類別,再利用抽象方法實作過程。這些抽象方法在子類別中被實作,以執行過程的每個步驟(如果這些步驟是獨立變化的,那麼每個步驟都可以用 strategy 模式來實作) |
本模式的 UML 圖如下:
接下來,我們會聊聊各種工廠模式,明天見!