簡單來說,其實就是想要完成一件事情,可以使用不同的策略去達成。
例如,想要設計一個排序演算法,有氣泡排序、插入排序、快速排序等等多種不同的方法,但是都可以達到一樣的結果。 又或者是搜尋演算法,其實也是一樣的道理。
再舉個例子,在購物網站買東西的付款方式,其實也是一樣,結帳的方式你可以選信用卡、轉帳、貨到付款等等,有很多不同的方式可以達到付款的目的。
以下直接用範例來了解什麼是策略設計模式(Strategy design pattern)。
假如今天我開了一家餐廳,顧客點了一支「烤」雞腿,我們可能會很直覺的這樣寫:
廚房裡面可以煎、烤、炸、蒸食物,乍看之下似乎沒什麼太大問題,但是其實烹飪有很多種方法,不是只有這四種,假如未來要增加「炒」呢? 在Kitchen再增加一個method嗎? 要增加「燉」呢? 再加一個method?
這樣子的設計,會讓日後Kitchen越來越龐大,因為現在code只是範例,可能感受不到會有多難維護,一旦日後有越來越多烹飪的方法要增加時,這份code會變得很雜亂。
另外有發現main裡面有switch嗎? 當未來烹飪方法越來越多時,這邊code也會越來越龐大,每增加一個烹飪方法,就要多一個case!
因此,我們可以把code改成下面這樣:
Console:
grill Chicken_leg
可以發現Kitchen裡面只剩下cook這個method,並且根據帶進來的class name來new出對應的obj,去做對應的烹飪動作(每種烹飪自己實作cook方法),這就是strategy design pattern。
也就是說,未來有新的烹飪方法要增加,只需增加新的class並且implements CookStrategy即可,其他地方都不用改,會自己根據顧客的選擇去做對應的烹飪!
另外,在Kitchen.java其實也可以寫成用switch case來決定要new哪種烹飪instance出來,這邊只是把它改成不用switch case,這不是strategy design pattern要討論的重點,只是如果是用switch case就會有之前提到的問題,每增加一種烹飪方法就要多一種case,也會違反OO原則!