Android 狀態(tài)模式

Android 23種設(shè)計(jì)模式

前言

狀態(tài)模式顧名思義,它是依據(jù)狀態(tài)的不同印衔,調(diào)用同樣的方法卻有不同的行為。每一個(gè)狀態(tài)都有一個(gè)共同的狀態(tài)基類,狀態(tài)模式的目的就是在狀態(tài)改變的時(shí)候躲惰,行為也跟著改變。
多用于一個(gè)對(duì)象的行為取決于它的狀態(tài)变抽,且必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變它的行為础拨。或者一個(gè)對(duì)象中有大量的操作判斷比如if else switch绍载,且依賴于該對(duì)象的狀態(tài)诡宗。

狀態(tài)模式定義

依據(jù)狀態(tài)的不同,調(diào)用同樣的方法卻有不同的行為

狀態(tài)模式舉例

我們舉一個(gè)車輛限行的例子:
重慶嘉華大橋最近實(shí)行限號(hào)措施逛钻,星期一限行尾數(shù)1和6僚焦、星期二限行尾數(shù)2和7,這里為了省略篇幅曙痘,我們只寫周一周二兩種狀態(tài)
先抽象出一個(gè)接口方法芳悲,判斷是否限行

public interface Check {
    boolean limit(int lastNumber);
}

然后定義周一和周二兩種不同狀態(tài)同個(gè)limit方法下,不同的處理行為边坤。

public class Monday implements Check {
    @Override
    public boolean limit(int lastNumber) {
        if (lastNumber == 1 || lastNumber == 6) {
            return true;
        }
        return false;
    }
}

public class Tuesday implements Check {
    @Override
    public boolean limit(int lastNumber) {
        if (lastNumber == 2 || lastNumber == 7) {
            return true;
        }
        return false;
    }
}

最后定義一個(gè)判斷限行的類名扛,來(lái)統(tǒng)一管理和處理

public class LimitLine {
    private Check check;

    public void setCheck(Check check) {
        this.check = check;
    }

    public boolean getLimitLine (int lastNumber) {
        return check.limit(lastNumber);378915406@qq.com
    }
}

到此,狀態(tài)模式就寫完了茧痒,然后我們看一下怎么調(diào)用它

        Monday monday = new Monday();
        Tuesday tuesday = new Tuesday();
        LimitLine limitLine = new LimitLine();

        limitLine.setCheck(monday);
        boolean mondayLimitOne = limitLine.getLimitLine(1);
        boolean mondayLimitTwo = limitLine.getLimitLine(2);

        limitLine.setCheck(tuesday);
        boolean tuesdayLimitOne = limitLine.getLimitLine(1);
        boolean tuesdayLimitTwo = limitLine.getLimitLine(2);


        Log.d("State","mondayLimitOne  = " + mondayLimitOne);
        Log.d("State","mondayLimitTwo  = " + mondayLimitTwo);

        Log.d("State","tuesdayLimitOne  = " + tuesdayLimitOne);
        Log.d("State","tuesdayLimitTwo  = " + tuesdayLimitTwo);

LOG輸出如下:

D/State: mondayLimitOne  = true
D/State: mondayLimitTwo  = false
D/State: tuesdayLimitOne  = false
D/State: tuesdayLimitTwo  = true
狀態(tài)模式小結(jié)

現(xiàn)在來(lái)整體看下代碼肮韧,狀態(tài)模式結(jié)構(gòu)很簡(jiǎn)單,根據(jù)不同的狀態(tài)旺订,使用同種方法(接口)弄企,通過(guò)子類去實(shí)現(xiàn)不同的行為。對(duì)與這里的例子就是区拳,根據(jù)星期幾的不同拘领,去判斷限行。方法是判斷限行樱调,但是因?yàn)?018-11-10星期幾這個(gè)狀態(tài)的不同约素,相同的尾號(hào)條件,相同的判斷方法笆凌,得到不同的結(jié)果圣猎。

最后說(shuō)下狀態(tài)模式和策略模式的區(qū)別,雖然他們?cè)诖a結(jié)構(gòu)上幾乎相同乞而,但思想確實(shí)不同的送悔,最最最最最根本的區(qū)別點(diǎn)在于:
1、策略模式的側(cè)重點(diǎn)是提供不同的方法(策略)。
2放祟、狀態(tài)模式的行為是由狀態(tài)來(lái)決定鳍怨,不同狀態(tài)有不同的行為。
One more thing! 有的人或許會(huì)認(rèn)為策略模式和狀態(tài)模式就是一種模式跪妥,但不是這樣鞋喇。假設(shè)我們現(xiàn)在對(duì)一個(gè)數(shù)組從小到大排序,這個(gè)時(shí)候我們寫了兩個(gè)策略眉撵,一個(gè)冒泡排序侦香,一個(gè)插入排序。兩個(gè)策略纽疟。結(jié)果都能正常排序罐韩。所以策略模式的重點(diǎn)是不同的策略上。狀態(tài)模式就是本文所講污朽,重點(diǎn)在狀態(tài)上散吵。

結(jié)束語(yǔ)

狀態(tài)模式的應(yīng)用場(chǎng)景也很明顯,就是根據(jù)狀態(tài)的不同蟆肆,同種方法需要不同的行為矾睦。如果不用狀態(tài)模式,你可以寫if else 或者 switch語(yǔ)句炎功,但是這樣會(huì)很臃腫枚冗,且不好擴(kuò)展,比如本文的例子蛇损,你需要判斷周一到周天七個(gè)狀態(tài)赁温,這里的方法的代碼簡(jiǎn)單還好,如果很復(fù)雜淤齐。你的代碼就會(huì)顯得很臃腫股囊。耦合度高,增加了出錯(cuò)率更啄。用狀態(tài)模式則能很好的避免稚疹,且代碼結(jié)構(gòu)簡(jiǎn)單清晰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锈死,一起剝皮案震驚了整個(gè)濱河市贫堰,隨后出現(xiàn)的幾起案子穆壕,更是在濱河造成了極大的恐慌待牵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇勋,死亡現(xiàn)場(chǎng)離奇詭異缨该,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)川背,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門贰拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛤袒,“玉大人,你說(shuō)我怎么就攤上這事膨更∶钫妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荚守,是天一觀的道長(zhǎng)珍德。 經(jīng)常有香客問(wèn)我,道長(zhǎng)矗漾,這世上最難降的妖魔是什么锈候? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮敞贡,結(jié)果婚禮上泵琳,老公的妹妹穿的比我還像新娘。我一直安慰自己誊役,他們只是感情好获列,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著势木,像睡著了一般蛛倦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啦桌,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天溯壶,我揣著相機(jī)與錄音,去河邊找鬼甫男。 笑死且改,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的板驳。 我是一名探鬼主播又跛,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼若治!你這毒婦竟也來(lái)了慨蓝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤端幼,失蹤者是張志新(化名)和其女友劉穎礼烈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婆跑,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡此熬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犀忱。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡募谎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阴汇,到底是詐尸還是另有隱情数冬,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布搀庶,位于F島的核電站吉执,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏地来。R本人自食惡果不足惜戳玫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望未斑。 院中可真熱鬧咕宿,春花似錦、人聲如沸蜡秽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芽突。三九已至试浙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞蚌,已是汗流浹背田巴。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挟秤,地道東北人壹哺。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艘刚,于是被迫代替她去往敵國(guó)和親管宵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 函數(shù)攀甚,是用來(lái)完成特定任務(wù)的獨(dú)立的代碼塊箩朴,指定一個(gè)函數(shù)名,在需要的時(shí)候可以多次調(diào)用秋度。函數(shù)對(duì)于程序員來(lái)說(shuō)并不陌生炸庞,今天...
    汪小喵閱讀 380評(píng)論 0 0
  • 今天天氣突然轉(zhuǎn)涼 窗外下著瀝瀝的小雨 明凈的玻璃上 染上了幾粒水珠 透過(guò)水珠 能看到幾枝 剛冒出的新芽芽 見此情況...
    傾花似雪閱讀 243評(píng)論 3 5
  • 常用BCD碼 十進(jìn)制數(shù) 8421碼 5421碼 2421碼 余3碼 余3循環(huán)碼 0 ...
    罐頭說(shuō)閱讀 666評(píng)論 0 0
  • 今天看了一篇關(guān)于人脈與能力誰(shuí)更重要的文章,深得我心静陈,因?yàn)槲恼碌臉?biāo)題是“內(nèi)向燕雁、不善社交的人如何建立人脈?”就這個(gè)標(biāo)題...
    山谷里的百合閱讀 2,978評(píng)論 0 1