設(shè)計(jì)模式-策略模式(常用)

介紹:

在軟件開發(fā)中也常常遇到類似的情況春瞬,實(shí)現(xiàn)某一個(gè)功能有多種算法或者策略柴信,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找宽气、排序等随常。
  一種常用的方法將多種算法寫到一個(gè)類中,該類提供多個(gè)方法萄涯,每一個(gè)方法對應(yīng)一個(gè)具體的查找算法绪氛;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過if…else…或者switch-case等條件判斷語句來進(jìn)行選擇涝影。這兩種實(shí)現(xiàn)方法我們都可以稱之為硬編碼枣察。然而,當(dāng)很多個(gè)算法集中在一個(gè)類中時(shí),這個(gè)類就會(huì)變得臃腫序目,這個(gè)類的維護(hù)成本變高也更易發(fā)生錯(cuò)誤臂痕。如果需要種一種新的排序算法,需要修改封裝算法類的源代碼猿涨。這就明顯違反了OCP原則和單一職責(zé)原則握童。
  如果將這些算法或者策略抽象出來 ,提供一個(gè)統(tǒng)一的接口叛赚,不同的算法或者策略有不同的實(shí)現(xiàn)類澡绩,這樣在程序客戶端就可以通過注入不同的實(shí)現(xiàn)對象來實(shí)現(xiàn)算法或者策略的動(dòng)態(tài)替換,這種式的可擴(kuò)展性俺附、可維護(hù)性也就更高肥卡,這就是策略模式。

定義:

策略模式定義了一系列的算法昙读,并將每一個(gè)算法封裝起來召调,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化蛮浑。

使用場景:

1.針對同一類型的多種處理方式,僅僅是具體行為有差別時(shí)只嚣。
2.需要安全地封裝多種同一類型的操作時(shí)沮稚。
3.出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if-else或者switch-case來選擇具體子類時(shí)册舞。

具體實(shí)現(xiàn):

不同的交通工具計(jì)費(fèi)規(guī)則不同蕴掏,以公交地鐵為例


public class StrategyModel {

    CalculateStrategy calculateStrategy;

    public void main(String[] args) {
        StrategyModel strategyModel = new StrategyModel();
        strategyModel.setStrategy(new BusStrategy());
        System.out.println("花費(fèi) " + strategyModel.calculatePrice(10) + " 元");


    }

    public void setStrategy(CalculateStrategy calculateStrategy) {
        this.calculateStrategy = calculateStrategy;
    }

    public int calculatePrice(int km) {
        return this.calculateStrategy.calculatePrice(km);
    }

    public interface CalculateStrategy {
        /**
         * 按距離計(jì)算價(jià)格
         *
         * @param km
         * @return
         */
        int calculatePrice(int km);
    }

    public class BusStrategy implements CalculateStrategy {

        @Override
        public int calculatePrice(int km) {
            return km * 5;
        }
    }


    class SubwayStrategy implements CalculateStrategy {

        @Override
        public int calculatePrice(int km) {
            return km * 10;
        }
    }

}

策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實(shí)現(xiàn)策略调鲸。這個(gè)模式很好地演示了開閉原則盛杰,也就是定義抽象,注入不同的實(shí)現(xiàn)藐石,從而達(dá)到很好的擴(kuò)展性即供。

優(yōu)點(diǎn):

結(jié)構(gòu)清晰明了,使用簡單直觀于微;
耦合充相應(yīng)而言較低逗嫡,擴(kuò)展方便;
操作封裝也更為徹底株依,數(shù)據(jù)更為安全驱证。

缺點(diǎn):

隨著策略的增加,子類也會(huì)變的繁多恋腕。


參考 :
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抹锄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伙单,老刑警劉巖获高,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異车份,居然都是意外死亡谋减,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門扫沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來出爹,“玉大人,你說我怎么就攤上這事缎除⊙暇停” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵器罐,是天一觀的道長梢为。 經(jīng)常有香客問我,道長轰坊,這世上最難降的妖魔是什么铸董? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮肴沫,結(jié)果婚禮上粟害,老公的妹妹穿的比我還像新娘。我一直安慰自己颤芬,他們只是感情好悲幅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著站蝠,像睡著了一般汰具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱魔,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天留荔,我揣著相機(jī)與錄音,去河邊找鬼豌习。 笑死存谎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肥隆。 我是一名探鬼主播既荚,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栋艳!你這毒婦竟也來了恰聘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晴叨,沒想到半個(gè)月后凿宾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年初厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙技。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡产禾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牵啦,到底是詐尸還是另有隱情亚情,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布哈雏,位于F島的核電站楞件,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裳瘪。R本人自食惡果不足惜土浸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彭羹。 院中可真熱鬧栅迄,春花似錦、人聲如沸皆怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愈腾。三九已至,卻和暖如春岂津,著一層夾襖步出監(jiān)牢的瞬間虱黄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工吮成, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橱乱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓粱甫,卻偏偏與公主長得像泳叠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子茶宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一危纫、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,939評論 1 15
  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對于銷售部門的人來講种蝶,這是一個(gè)非常重大契耿、非常復(fù)雜的問題,對不同的...
    七寸知架構(gòu)閱讀 5,079評論 9 62
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP)螃征,是說軟件實(shí)體(類搪桂、模塊、函數(shù)等等)應(yīng)該可以拓展盯滚,但是不可修改踢械。開-閉原...
    西山薄涼閱讀 3,797評論 3 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,083評論 25 707
  • 1 場景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià),對于銷售部門的人來講淌山,這是一個(gè)非常重大裸燎、非常復(fù)雜的問題,對不同的客戶要...
    4e70992f13e7閱讀 3,087評論 2 16