設計模式系列(1)策略模式

閱讀本文大概需要花費您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(動畫)對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 什么是策略模式 策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶...
    Zentopia閱讀 3,808評論 6 11
  • 模擬鴨子游戲的需求 SimUDuck游戲中會出現各種鴨子,一邊游泳戲水,一邊呱呱叫。通過標準的OO技術,設計一個超...
    一縷陽憶往昔閱讀 503評論 2 0
  • 設計模式 開題先說明一下,設計模式告訴我們如何組織類和對象以解決某種問題。讓代碼變得更加優雅是我們責無旁貸的任務 ...
    tanghuailong閱讀 463評論 0 2
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 文/向內行走的人 “ 做人難,做好人更難上加難。” 小時候,家長告訴我們要做一個樂于助人的好...
    好玖不見閱讀 338評論 0 1