Head First 設計模式第一章 ----策略模式
設計原則
設計模式告訴我們如何組織類和物件以解決某種問題。
第一個設計原則:找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
(把會變化的部分取出並“封裝“起來,好讓其他部分不會受到影響)
第二個設計原則:針對介面程式設計,而不是針對實現程式設計
(”針對介面程式設計“真正的意思是”針對超型別程式設計“,抽象超型別可以是抽象類或介面)
理解例子:
”針對實現程式設計“: "針對介面/超型別程式設計":
Dog d = new Dog(); Animal animal=new Dog();
d.makeSound(); animal.makeSound();
子類例項化的動作不再需要在程式碼中硬編碼,而是”在執行時才指定具體實現的物件“!
第三個設計原則:多用組合,少用繼承
使用組合建立系統具有很大的彈性,不僅可將演算法族(方法)封裝成類,更可以“在執行時動態地改變行為”
,只要組合的行為物件符合正確的介面標準即可。
策略模式定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
(1) 應用場景
a. 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。
b.
需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現
c. 對客戶隱藏具體策略的實現細節,彼此完全獨立。
(2) 優缺點
a. 提供了一種替代繼承的方法,而且既保持了繼承的優點(程式碼重用)還比繼承更靈活(演算法獨立,可以任意擴充套件)[優點]
b. 避免程式中使用多重條件轉移語句,使系統更靈活,並易於擴充套件[優點]
c. 遵守大部分GRASP原則和常用設計原則,高內聚、低偶合[優點]
d. 因為每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量[缺點]