iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

來讀設計模式:Junior developer 跟大家一起練功系列 第 18

DAY18: Template Method 模式

本篇討論 template method 模式,我會涵括

  • 案例:支援兩種資料庫
  • 使用它的時機
  • Template Method 模式的關鍵特徵
  • 使用它的好處

案例:支援兩種資料庫

一樣是電子商務系統的例子。假設今天有一項新需求:系統要能夠支援 Oracle 與 SQL Server 資料庫。雖然兩者都基於能夠使資料庫使用更加簡單的通用標準 SQL。但是兩個系統的細節仍然存在差別。

使用 Template Method 模式

我們希望在上面的案例裡使用 template method 模式。首先先簡單介紹一下。

GoF 是如此說的:

(Template method 模式)定義一個操作中演算法的骨架,而將一些步驟延遲到子類別中。不改算演算法的結構而重定義它的步驟。

它提供了一種方式:在一個抽象類別中捕捉共同點,同時在衍生類別中封裝差異。Template method 模式能控制不同過程中共同的序列。

在這個案例中,我們將 template method 模式應用進去後的樣子如下。

使用它的時機

到處的 If-Else 和 Copy-Paste

有沒有這種經驗,因為要介接幾個不同部門的系統,他們所用的規則大致相同,但是有些細節的處理上不同。

在實作上,直覺可能會使用 if-else 語句去做系統的選擇;或是直接 copy-paste 。前者有可能會使程式碼變壞;後者會造成程式碼出現冗餘。

這時候可以引入此模式來去除重複與避免可能錯誤的細節。

Template Method 模式的引入步驟

引入有三步驟:

  • Step1:重構原有方案(使用 Extract 方法重構),提取要修改的部分(找到變化並且封裝之)
  • Step2:建立基本類別包含不變的 methods。
  • Step3:編寫基本類別的衍生類別。

Template Method 模式的關鍵特徵

項目 內容
意圖 定義一個操作中演算法的骨架。將一些步驟推遲到子類別。可以不改變演算法的結構而重定義該演算法的步驟
問題 要完成在某一細節層次一致的一個過程或一系列步驟,但其各別步驟在更詳細的層次上實作可能不同
解決方案 允許可變的子步驟,但基本過程保持一致
參與者與協作者 此模式由一個抽象類別組成,這個抽象類別定義了需要覆蓋的基本 TemplateMethod()。每個從這個抽象類別衍生的具體類別將為此範本實作新方法
效果 範本提供了一個很好的程式碼再利用平台,確保所需步驟的實作。
實作 建立一個抽象類別,再利用抽象方法實作過程。這些抽象方法在子類別中被實作,以執行過程的每個步驟(如果這些步驟是獨立變化的,那麼每個步驟都可以用 strategy 模式來實作)

本模式的 UML 圖如下:

接下來

接下來,我們會聊聊各種工廠模式,明天見!


上一篇
DAY17: Observer 模式
下一篇
DAY19: 討論工廠模式
系列文
來讀設計模式:Junior developer 跟大家一起練功22

尚未有邦友留言

立即登入留言