l

2013年8月5日 星期一

重新整理Strategy Pattern

August 02 10:10~12:10

螢幕快照 2013-08-02 下午12.08.42

 

廢話不多說,今天整理Strategy模式。

***

Name:Strategy

Context:為了達到相同的目的,物件可以因地制宜,讓行為擁有多種不同的實作方法。例如,一個壓縮檔案物件,可以採用zip、arj、rar、tar、7z等不同的演算法來執行壓縮工作。

Problem:如何讓物件自由切換演算法或行為實作?

Force:

  • 你可以把所有的演算法全部寫進同一個物件,然後用條件式判斷來選用所要執行的版本,但是:
    • 物件的程式碼很容易變得過於複雜與肥大,不好理解與修改。
    • 物件占用過多的記憶體空間,因為可能不會使用到全部的演算法。
    • 擴充新的演算法必須要修改既有的程式碼。
    • 不容易分別開發、修改與測試每一個演算法。
  • 你可以透過繼承,讓子類被重新定義自己的演算法。但是這樣會產生許多類似的類別,但僅僅只有行為上些微的差別。

Solution:將演算法從物件(Context)身上抽離出來。為演算法定義一個Strategy介面,針對每一種演算法,新增一個實作Strategy介面的ConcreteStrategy物件。把物件中原本的演算法實作程式碼移到相對應的ConcreteStrategy物件身上。讓Context物件擁有一個指向Strategy介面的成員變數,在執行期間藉由改變Strategy成員變數所指向的ConcreteStrategy物件,來切換不同的演算法演算法。

 

image

圖片來源:GoF。

***

Teddy上課時所舉的Strategy例子。

螢幕快照 2013-08-02 上午11.46.44


***

昨天整理Observer花了四個小時,今天整理Strategy只花了兩小時。雖然這兩個設計模式都很常用,而且Teddy使用Observer的機會還比Strategy要多,但是不知道為什麼,昨天整理Observer花的時間比較長,卻好像沒有整理得比較好挑眉質疑。呵呵,可能是昨天比較沒fu吧…

***

友藏內心獨白:4/23,完成率17.39%。

2 則留言:

  1. 太酷了 ~ 我又學到了,恩恩 ~
    每天進步一點點...

    回覆刪除
  2. 謝謝分享,淺顯易懂的解說!

    回覆刪除