什么是策略模式?
它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。
什么時候去使用策略模式?
策略模式就是用來封裝算法的,但是在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
適用的場景?
1、如果在一個系統里面有許多類,它們之間的區別僅在於它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。
2、一個系統需要動態地在幾種算法中選擇一種。
3、如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
策略模式的優點?
1、策略模式的Strategy類層次為Context定義了一系列的可供重用的算法或行為。繼承有助於析取出這些算法中的公共功能。
2、簡化了單元測試,因此每個算法都有自己的類,可以通過自己的接口單獨測試。
策略模式:
Strategy類,定義所有支持的算法的公共接口。
ConcreteStrategy,封裝了具體的算法或行為,繼承與Strategy。這里分別用ConcreteStrategyA和ConcreteStrategyB來實現。
Context,用一個ConcreteStrategy來進行配置,維護一個對Strategy對象的引用。
初始化時,傳入具體的策略對象。
在根據具體的策略對象,調用其算法的方法。
客戶端運行代碼。
運行結果:
由於實例化不同的策略,所以最終在調用context.ContextInterface();時,所獲得的的結果就不盡相同。
策略模式是一種定義一些列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方法調用所有的算法,減少了各種算法類與使用算法類之間的耦合。
在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉給策略模式的Context對象。這本身並沒有解除客戶端需要選擇判斷的壓力,可以將策略模式和簡單工廠模式結合,選擇具體來實現的職責就可以給Context來承擔,最大化地減輕了客戶端的職責。
策略模式和簡單工廠模式的區別:
簡單工廠模式:只需要發出命令,由他人去實現。
策略模式:不知要發出命令,還得由自己親自去做。
兩個的區別非常微妙,Factory是直接創建詳細的對象並用該對象去運行對應的動作,而Strategy將這個操作給了Context類。沒有創建詳細的對象,實現的代碼的進一步封裝。
喜歡的小伙伴們可以搜索我們個人的微信公眾號“程序員的成長之路”點擊關注或掃描下方二維碼