設(shè)計(jì)模式系列-策略模式偿渡,狀態(tài)模式

策略模式

定義:定義一組算法,將每個(gè)算法都封裝起來(lái)霸奕,并且使它們之間可以互換溜宽。

應(yīng)用場(chǎng)景:
1.多個(gè)類只有在算法或行為上稍有不同的場(chǎng)景。

2.算法需要自由切換的場(chǎng)景质帅。

3.需要屏蔽算法規(guī)則的場(chǎng)景适揉。

strategy.png

角色:
Context封裝角色:屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn)临梗,封裝可能存在的變化涡扼。

Strategy抽象策略角色:策略稼跳、算法家族的抽象盟庞,通常為接口,定義每個(gè)策略或算法必須具有的方法和屬性汤善。

ConcreteStrategy具體策略角色:實(shí)現(xiàn)抽象策略中的操作什猖,該類含有具體的算法。

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

    public class Price {
        private int type;

        public static final int TYPE_Primary = 1;  //普通會(huì)員
        public static final int TYPE_Intermediate = 2;  //中級(jí)會(huì)員
        public static final int TYPE_Advanced = 3;   //高級(jí)會(huì)員

        public void setType(int type){
            this.type = type;
        }

        /**
         * 計(jì)算圖書的價(jià)格
         */
        public double quote(double booksPrice){
            if(type == TYPE_Primary){
                System.out.println("對(duì)于初級(jí)會(huì)員的沒(méi)有折扣");
                return booksPrice;
            } else if(type == TYPE_Intermediate){
                System.out.println("對(duì)于中級(jí)會(huì)員的折扣為10%");
                return booksPrice * 0.9;
            } else if(type == TYPE_Advanced){
                System.out.println("對(duì)于高級(jí)會(huì)員的折扣為20%");
                return booksPrice * 0.8;
            } else {
                System.out.println("這是啥红淡?不狮??");
                return -1;
            }
        }
    }

策略模式實(shí)現(xiàn):

    public interface MemberStrategy {
        /**
         * 計(jì)算圖書的價(jià)格
         * @param booksPrice    圖書的原價(jià)
         * @return    計(jì)算出打折后的價(jià)格
         */
        public double calcPrice(double booksPrice);
    }

    public class PrimaryMemberStrategy implements MemberStrategy {
        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("對(duì)于初級(jí)會(huì)員的沒(méi)有折扣");
            return booksPrice;
        }

    }

    public class IntermediateMemberStrategy implements MemberStrategy {

        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("對(duì)于中級(jí)會(huì)員的折扣為10%");
            return booksPrice * 0.9;
        }
    }

    public class AdvancedMemberStrategy implements MemberStrategy {

        @Override
        public double calcPrice(double booksPrice) {
            System.out.println("對(duì)于高級(jí)會(huì)員的折扣為20%");
            return booksPrice * 0.8;
        }
    }

    public class Price {
        //持有一個(gè)具體的策略對(duì)象
        private MemberStrategy strategy;

        public setMemberStrategy(MemberStrategy strategy){
            this.strategy = strategy;
        }

        /**
         * 計(jì)算圖書的價(jià)格
         */
        public double quote(double booksPrice){
            return this.strategy.calcPrice(booksPrice);
        }
    }

策略模式的優(yōu)點(diǎn):

算法可以自由切換

避免使用多重條件判斷

擴(kuò)展性良好

策略模式的缺點(diǎn):

策略類數(shù)量增多

所有的策略類都需要對(duì)外暴露

狀態(tài)模式

定義:當(dāng)一個(gè)對(duì)象內(nèi)在狀態(tài)改變時(shí)允許其改變行為在旱,這個(gè)對(duì)象看起來(lái)像改變了其類摇零。

應(yīng)用場(chǎng)景:

1.行為隨狀態(tài)改變而改變的場(chǎng)景。

2.條件桶蝎、分支判斷語(yǔ)句的替代者驻仅。

state.png

角色:

State抽象狀態(tài)角色:接口或抽象類,負(fù)責(zé)對(duì)象狀態(tài)定義登渣,并且封裝環(huán)境角色以實(shí)現(xiàn)狀態(tài)切換噪服。

ConcreteState具體狀態(tài)角色:本狀態(tài)下要做的事情。

Context環(huán)境角色:定義客戶端需要的接口胜茧,并且負(fù)責(zé)具體狀態(tài)的切換粘优。

    public interface MemberState {
        /**
         * 計(jì)算圖書的價(jià)格
         * @param booksPrice    圖書的原價(jià)
         * @return    計(jì)算出打折后的價(jià)格
         */
        public void buyBook(double booksPrice);
    }

    public class PrimaryMemberState implements MemberState {
        @Override
        public void buyBook(double booksPrice) {
            System.out.println("對(duì)于初級(jí)會(huì)員的沒(méi)有折扣" + booksPrice);
        }

    }

    public class IntermediateMemberState implements MemberState {

        @Override
        public void buyBook(double booksPrice) {
            System.out.println("對(duì)于中級(jí)會(huì)員的折扣為10%" + booksPrice * 0.9);
        }
    }

    public class AdvancedMemberState implements MemberState {

        @Override
        public void buyBook(double booksPrice) {
            System.out.println("對(duì)于高級(jí)會(huì)員的折扣為20%"+ booksPrice * 0.8);
        }
    }

    public class Person {
        //持有一個(gè)具體的策略對(duì)象
        private MemberState state;

        public setMemberStrategy(MemberState state){
            this.state = state;
        }

        /**
         * 買一本書
         */
        public void buyBook(double booksPrice){
            this.state.buyBook(booksPrice);
        }
    }

策略模式vs狀態(tài)模式:

問(wèn)題的重點(diǎn)是業(yè)務(wù)關(guān)注的是什么,是狀態(tài)還是工作邏輯呻顽?找準(zhǔn)了業(yè)務(wù)的焦點(diǎn)雹顺,才能選擇一個(gè)好的設(shè)計(jì)模式。

解決問(wèn)題的重點(diǎn)不同:

策略模式旨在解決內(nèi)部算法如何改變的問(wèn)題廊遍,也就是將內(nèi)部算法的改變對(duì)外界的影響降低到最小无拗,它保證的是算法可以自由地切換;

而狀態(tài)模式旨在解決內(nèi)在狀態(tài)的改變而引起行為改變的問(wèn)題昧碉,它的出發(fā)點(diǎn)是事物的狀態(tài)英染,封裝狀態(tài)而暴露行為揽惹,一個(gè)對(duì)象的狀態(tài)改變,從外界來(lái)看就好像是行為改變四康。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搪搏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闪金,更是在濱河造成了極大的恐慌疯溺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哎垦,死亡現(xiàn)場(chǎng)離奇詭異囱嫩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漏设,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門墨闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人郑口,你說(shuō)我怎么就攤上這事鸳碧。” “怎么了犬性?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瞻离,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乒裆,道長(zhǎng)套利,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任鹤耍,我火速辦了婚禮肉迫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惰蜜。我一直安慰自己昂拂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布抛猖。 她就那樣靜靜地躺著格侯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪财著。 梳的紋絲不亂的頭發(fā)上联四,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音撑教,去河邊找鬼朝墩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伟姐,可吹牛的內(nèi)容都是我干的收苏。 我是一名探鬼主播亿卤,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹿霸!你這毒婦竟也來(lái)了排吴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懦鼠,失蹤者是張志新(化名)和其女友劉穎钻哩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛冶,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡街氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睦袖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珊肃。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扣泊,靈堂內(nèi)的尸體忽然破棺而出近范,到底是詐尸還是另有隱情嘶摊,我是刑警寧澤延蟹,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站叶堆,受9級(jí)特大地震影響阱飘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虱颗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一沥匈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忘渔,春花似錦高帖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宣赔,卻和暖如春预麸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背儒将。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吏祸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钩蚊。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓贡翘,卻偏偏與公主長(zhǎng)得像蹈矮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸣驱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,282評(píng)論 25 707
  • 設(shè)計(jì)模式匯總 一含滴、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,948評(píng)論 1 15
  • 我去車站接她的那天是我們第二次見(jiàn)面。記得那天風(fēng)很柔递胧,墨藍(lán)的天空沒(méi)有一顆星星碑韵,卻美的純凈。 她在杭州中轉(zhuǎn)缎脾,有半天的逗...
    白木木木閱讀 257評(píng)論 0 0
  • 不要質(zhì)疑孩子的能力祝闻,尤其很多事情她們都可以辦到,只是你單方認(rèn)為她們辦不到遗菠,解決了一個(gè)問(wèn)題她們也會(huì)很有成就感联喘,增加自...
    昵稱也不能重復(fù)不像話閱讀 96評(píng)論 0 0
  • 最近和舊客戶會(huì)面, 大家年紀(jì)相若辙纬, 她說(shuō):「嘉寶豁遭, 你要照顧好自己身體, 我們家人日後的保單就靠你管理啦贺拣!」 原來(lái)...
    歐嘉寶理財(cái)顧問(wèn)閱讀 505評(píng)論 1 0