August 02 10:10~12:10
廢話不多說,今天整理Strategy模式。
***
Name:Strategy
Context:為了達到相同的目的,物件可以因地制宜,讓行為擁有多種不同的實作方法。例如,一個壓縮檔案物件,可以採用zip、arj、rar、tar、7z等不同的演算法來執行壓縮工作。
Problem:如何讓物件自由切換演算法或行為實作?
Force:
- 你可以把所有的演算法全部寫進同一個物件,然後用條件式判斷來選用所要執行的版本,但是:
- 物件的程式碼很容易變得過於複雜與肥大,不好理解與修改。
- 物件占用過多的記憶體空間,因為可能不會使用到全部的演算法。
- 擴充新的演算法必須要修改既有的程式碼。
- 不容易分別開發、修改與測試每一個演算法。
- 你可以透過繼承,讓子類被重新定義自己的演算法。但是這樣會產生許多類似的類別,但僅僅只有行為上些微的差別。
Solution:將演算法從物件(Context)身上抽離出來。為演算法定義一個Strategy介面,針對每一種演算法,新增一個實作Strategy介面的ConcreteStrategy物件。把物件中原本的演算法實作程式碼移到相對應的ConcreteStrategy物件身上。讓Context物件擁有一個指向Strategy介面的成員變數,在執行期間藉由改變Strategy成員變數所指向的ConcreteStrategy物件,來切換不同的演算法演算法。
圖片來源:GoF。
***
Teddy上課時所舉的Strategy例子。
***
昨天整理Observer花了四個小時,今天整理Strategy只花了兩小時。雖然這兩個設計模式都很常用,而且Teddy使用Observer的機會還比Strategy要多,但是不知道為什麼,昨天整理Observer花的時間比較長,卻好像沒有整理得比較好。呵呵,可能是昨天比較沒fu吧…
***
友藏內心獨白:4/23,完成率17.39%。
太酷了 ~ 我又學到了,恩恩 ~
回覆刪除每天進步一點點...
謝謝分享,淺顯易懂的解說!
回覆刪除