策略模式

類圖

為什么要將飛行和呱呱叫行為算法提取出來?

  • 這些行為是容易變化的,將它們提取出來后續(xù)行為的具體實(shí)現(xiàn)方式發(fā)生變化不會(huì)對(duì)duck類產(chǎn)生任何影響,只需要修改具體行為實(shí)現(xiàn)類自身的邏輯。(即為封裝變化)

  • 很多鴨子類型其實(shí)并不需要飛行,如橡皮鴨,死鴨子等,如果將飛行和叫行為放在duck父類中,所有的duck實(shí)現(xiàn)類都必須實(shí)現(xiàn)該方法,不需要該方法行為的鴨子在實(shí)現(xiàn)時(shí)就只能override該方法后空著不實(shí)現(xiàn)具體邏輯,這樣會(huì)導(dǎo)致產(chǎn)生很多重復(fù)無用代碼。將這兩種行為作為duck的類變量,所有的飛行和呱呱叫都會(huì)委托具體行為去執(zhí)行,則可以清除這些無用代碼。(個(gè)人另外看法,對(duì)于無用代碼來說,可以把fly和quack方法座位duck類的普通方法,不要定義為抽象方法就可以了,不需要實(shí)現(xiàn)該方法的鴨子不要重寫該方法就好了)(組合代替繼承)

  • <b>個(gè)人看來最最最重要的一點(diǎn),也是策略模式的核心功能:運(yùn)行時(shí)可動(dòng)態(tài)改變行為策略</b>,通過duck類暴露setter方法的方式,調(diào)用方可隨時(shí)根據(jù)需求更換duck類的行為策略,這也是在我看來<b>策略模式跟模版方法模式最大最大的區(qū)別</b>

策略模式在實(shí)際開發(fā)中的應(yīng)用

首先,我在百度上搜到了好多展示自己如何運(yùn)用策略模式重構(gòu)自己代碼的例子,看完都發(fā)現(xiàn)其實(shí)完全不是那么回事,大多數(shù)案例都是以if else或者switch case這種代碼為切入點(diǎn),說根據(jù)策略模式可以去掉這些難看的層層判斷,他們基本采用的方式是維護(hù)了一個(gè)map,客戶端調(diào)用時(shí)通過map找到對(duì)應(yīng)的策略,然后執(zhí)行策略方法....從本質(zhì)上看這和if else沒有任何本質(zhì)的區(qū)別吧,只是把判斷具體用哪個(gè)策略的方法從if else改善成用map查找了而已。

個(gè)人覺得策略模式要想用好,必須反映出運(yùn)行時(shí)動(dòng)態(tài)改變策略的能力。不然即使使用了策略模式,也就是模版方法模式的變種而已!!!

另外,關(guān)于運(yùn)行時(shí)動(dòng)態(tài)改變策略,應(yīng)該是每一次改變是全局性的改變,只要改變了之后這個(gè)context類在下一次被修改策略前都要保持以現(xiàn)在的策略響應(yīng)請(qǐng)求。(就是說改變不是臨時(shí)改變,。。。不知道怎么形容)

在非單機(jī)的環(huán)境中,策略模式可能需要依靠消息中間件同步各服務(wù)器同時(shí)響應(yīng)策略修改,在分布式web開發(fā)中,策略模式使用場(chǎng)景目前我狹隘的眼光看來還比較難用上,稍微可以想到的可能是一些容災(zāi)方案上面的,全局的策略變更也必須通過消息中間件或者分布式數(shù)據(jù)庫(kù)緩存等來實(shí)現(xiàn),且要考慮一些容災(zāi)邏輯。

下面是自己想到的一些可以運(yùn)營(yíng)策略模式的場(chǎng)景:

  • head first中提到的游戲中更換游戲角色的武器
  • 實(shí)時(shí)翻譯程序中點(diǎn)擊切換語(yǔ)言按鈕時(shí)更換翻譯策略
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式 開題先說明一下,設(shè)計(jì)模式告訴我們?nèi)绾谓M織類和對(duì)象以解決某種問題。讓代碼變得更加優(yōu)雅是我們責(zé)無旁貸的任務(wù) ...
    tanghuailong閱讀 493評(píng)論 0 2
  • 1 場(chǎng)景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對(duì)于銷售部門的人來講,這是一個(gè)非常重大、非常復(fù)雜的問題,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,254評(píng)論 9 62
  • 模擬鴨子游戲的需求 SimUDuck游戲中會(huì)出現(xiàn)各種鴨子,一邊游泳戲水,一邊呱呱叫。通過標(biāo)準(zhǔn)的OO技術(shù),設(shè)計(jì)一個(gè)超...
    一縷陽(yáng)憶往昔閱讀 563評(píng)論 2 0
  • 1 場(chǎng)景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià),對(duì)于銷售部門的人來講,這是一個(gè)非常重大、非常復(fù)雜的問題,對(duì)不同的客戶要...
    4e70992f13e7閱讀 3,219評(píng)論 2 16
  • 這幾天正好學(xué)習(xí)到了軟件測(cè)試的白盒測(cè)試部分,但在圖書館書籍和課本上找不到相關(guān)的內(nèi)容,于是一部分一部分百度學(xué)習(xí)之后,總...
    WhiteWerer閱讀 531評(píng)論 0 0

友情鏈接更多精彩內(nèi)容