閱讀本文大概需要花費(fèi)您2分鐘
文章內(nèi)容來自對(duì)《Head First 設(shè)計(jì)模式》第一章,《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》第七章學(xué)習(xí)總結(jié)。
一個(gè)概念
- 策略模式:
定義了算法族鞭衩,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨(dú)立于使用算法的客戶倾芝。
三個(gè)設(shè)計(jì)原則
1)** 找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來箭跳,不要和那些不需要變化的代碼混在一起**
比如鴨子類的叫和飛的行為就屬于變化的部分晨另,獨(dú)立出來后鴨子類可以動(dòng)態(tài)去設(shè)置不同的行為。
2)設(shè)計(jì)接口編程谱姓,而不是針對(duì)實(shí)現(xiàn)編程借尿。
3)多用組合,少用繼承
鴨子的行為是多個(gè)行為對(duì)象組合而來屉来,不是用的繼承路翻。
主要講了創(chuàng)建一個(gè)鴨子類,需要飛和叫等行為茄靠,動(dòng)態(tài)去改變茂契。
應(yīng)用示例
- 一個(gè)示例:
真實(shí)的鴨子:會(huì)叫(嘎嘎叫) 會(huì)飛 會(huì)游泳
橡皮鴨:會(huì)叫(吱吱叫),不會(huì)飛 不會(huì)游泳
誘餌鴨:不會(huì)叫 不會(huì)飛 不會(huì)游泳
··· ···
兩種有缺陷實(shí)現(xiàn)方式:
(1)繼承
存在的問題:
1)代碼在多個(gè)子類中重復(fù)慨绳,就算有些鴨子不會(huì)嘎嘎叫掉冶,仍然要去實(shí)現(xiàn)父類的“叫”的方法,但不過是do nothing
2)很難知道鴨子的全部行為脐雪,因?yàn)橛行┓椒m然實(shí)現(xiàn)卻是do nothing
3)運(yùn)行時(shí)行為不易改變
4)改變會(huì)牽一發(fā)動(dòng)全身郭蕉,造成其他鴨子不想要的改變。如果需要鴨子跳舞喂江,父類增加這個(gè)方法后召锈,其他所有繼承該父類的鴨子
都需要去實(shí)現(xiàn)這個(gè)方法。就造成了1)和2)的問題获询。
(2)使用Flyable和Quackable接口涨岁,需要此類行為的對(duì)象,實(shí)現(xiàn)相關(guān)接口即可
存在的問題:
1)代碼沒有辦法復(fù)用吉嚣。比如每一個(gè)會(huì)嘎嘎叫的鴨子對(duì)象都需要重新去實(shí)現(xiàn)一遍嘎嘎叫的接口梢薪。
2)每次新增加一種鴨子類型,就需要檢查相關(guān)接口是否已經(jīng)實(shí)現(xiàn)尝哆。
策略模式實(shí)現(xiàn):
[沒學(xué)會(huì)怎么畫uml秉撇,繼續(xù)改進(jìn) = =]
代碼請(qǐng)見:
https://github.com/chaozaiai/JavaTrain/tree/master/headfirst_mode/chapter01
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn) 》
使用場景:
- 針對(duì)同一類型問題的多種處理方式,僅僅是具體行為有差別時(shí)
- 需要安全的封裝多種同一類型的操作時(shí)
- 出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if-else后者switch-case來選擇具體子類時(shí)
android 使用策略模式實(shí)現(xiàn)舉的例子是Animation(動(dòng)畫)對(duì)象琐馆。