閱讀本文大概需要花費您2分鐘
文章內容來自對《Head First 設計模式》第一章,《Android源碼設計模式解析與實戰》第七章學習總結。
一個概念
- 策略模式:
定義了算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。
三個設計原則
1)** 找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起**
比如鴨子類的叫和飛的行為就屬于變化的部分,獨立出來后鴨子類可以動態去設置不同的行為。
2)設計接口編程,而不是針對實現編程。
3)多用組合,少用繼承
鴨子的行為是多個行為對象組合而來,不是用的繼承。
主要講了創建一個鴨子類,需要飛和叫等行為,動態去改變。
應用示例
- 一個示例:
真實的鴨子:會叫(嘎嘎叫) 會飛 會游泳
橡皮鴨:會叫(吱吱叫),不會飛 不會游泳
誘餌鴨:不會叫 不會飛 不會游泳
··· ···
兩種有缺陷實現方式:
(1)繼承
存在的問題:
1)代碼在多個子類中重復,就算有些鴨子不會嘎嘎叫,仍然要去實現父類的“叫”的方法,但不過是do nothing
2)很難知道鴨子的全部行為,因為有些方法雖然實現卻是do nothing
3)運行時行為不易改變
4)改變會牽一發動全身,造成其他鴨子不想要的改變。如果需要鴨子跳舞,父類增加這個方法后,其他所有繼承該父類的鴨子
都需要去實現這個方法。就造成了1)和2)的問題。
(2)使用Flyable和Quackable接口,需要此類行為的對象,實現相關接口即可
存在的問題:
1)代碼沒有辦法復用。比如每一個會嘎嘎叫的鴨子對象都需要重新去實現一遍嘎嘎叫的接口。
2)每次新增加一種鴨子類型,就需要檢查相關接口是否已經實現。
策略模式實現:
Paste_Image.png
[沒學會怎么畫uml,繼續改進 = =]
代碼請見:
https://github.com/chaozaiai/JavaTrain/tree/master/headfirst_mode/chapter01
《Android源碼設計模式解析與實戰 》
使用場景:
- 針對同一類型問題的多種處理方式,僅僅是具體行為有差別時
- 需要安全的封裝多種同一類型的操作時
- 出現同一抽象類有多個子類,而又需要使用if-else后者switch-case來選擇具體子類時
android 使用策略模式實現舉的例子是Animation(動畫)對象。