2021年7月1日 星期四

[設計模式] 提煉出父類別也是一種設計模式 !? Template Method Pattern 範本方法 的真正目的

這不就是把相同的程式碼,提煉出來組成abstract class嗎?

其實大話作者提到了 Pattern Method 的真正重點:

" 定義一個操作中的演算法骨架,而將一些步驟延遲到子類別中。 "

我覺得類別圖並不能表達出Template Method的目的,但還是先來看架構圖:

白話一點就是,Pattern Method 的核心概念不只是提煉相同的程式碼,

而是"定義演算法骨架",這個演算法骨架是各個 Function 執行的流程與步驟,

例如一張影像需要進行影像處理,

那你便可以定義演算法流程如下:

abstract Image midianFilter(Image);
abstract Image Binarization(Image);
abstract Image sobelFilter(Image)

Image ImageProcess(Image im)
{
        im = midianFilter(im);
        im = Binarization(im);
        im = sobelFilter(im);
        return im;
}

規範了每個人對於每張剛擷取到的影像都必須要進行這三個影像處理步驟,

但實際處理的三個方法卻留給繼承的子類別自己去細定義,

他們可以自己去設計各個處理步驟的細節、參數。


應用情境

大話作者提供了兩個範例,但我覺得第一個範例比較不能體會出上面這個重點,

請參考 Chapter_10.1 ,這邊就先略過不談。

來看我小小改變情境的第二個範例 Chapter_10.2

前面文章提到我有多個品牌的攝影機需要使用,

會選擇用策略模式來切換我不同的攝影機,

但這僅僅是"選用"上的切換,

選好之後,這些攝影機都有固定的啟動步驟,

像這樣每台攝影機都會固定進行的步驟,就適合以範本方法來規範固定步驟,

例如:

    連線 > 設定參數 > 開啟攝影

因此我們可以定義一個 abstract class 來規範這些事情。

接著把實作細節延遲到子類別來完成,這邊提供兩個不同廠牌相機的子類別。

可以發現A廠牌的相機使用了 serial port 作為連接方式,

而B廠牌的相機使用了 socket 作為連接方式,

而第二個參數設定兩者也不盡相同,

有些攝影機開放設定頻率,有些開放設定白平衡,有些則什麼都不開放,

但都達成了父類 initial camera 步驟的目的。


Strategy Pattern 與 Template Method Pattern 的差異?

回過頭來談 Template Method 和 Strategy

有沒有覺得兩個很像,

似乎兩者都是方便切換"相同功能但不同的類別"以達到相同的工作目的?

但他們的差異在哪裡?

以我的理解,在文章中間有稍微提到,Strategy 主要就著重在"切換",

而這些不同的 Strategy 有一個共同的父類可以乘載所有的子類進行操作(多型),

但我想範本方法的重點應該在於,它在父類定義了"使用架構(流程)",

如同上面範例的 InitialCamera() ,

讓子類只需要填寫實作內容,至於怎麼做,執行順序在父類已經定義好了,

提煉各個相似功能子類別的重複功能程式碼,並規範"執行架構"

這才是範本方法的主要目的。


總結

範本方法的重點就在於,

提取重複的程式碼,規範執行架構

並把實作細節開放給子類去細部定義。



2 則留言:

  1. 要不要再加一個uml阿~更快懂

    回覆刪除
    回覆
    1. 好哦,晚點補上,順便把Strategy和Template Method結合看看,似乎也滿好用的。

      刪除

社會新鮮人如何投資?

我的觀點是,在 沒有很多 本錢 的情況下, 別寄望每個月幾千元放到股票或者最近很夯的高股息ETF就能讓你致富, 先投資自己,讓自己的本業收入提高吧。