狀態(tài)模式 ~ 設(shè)計(jì)模式之二

為啥第2個說狀態(tài)模式呢纵菌,說是這兩種模式在使用結(jié)構(gòu)上有點(diǎn)相似,不過休涤,實(shí)際上也的確是這樣的咱圆,呵呵,下面細(xì)說功氨。

1. 定義

整個對象的行為序苏,基于它的狀態(tài)變化,各個狀態(tài)之間可以動態(tài)切換捷凄,且狀態(tài)切換時忱详,對象內(nèi)部還有一些其他邏輯的變化。

2. 優(yōu)點(diǎn)

1)代碼結(jié)構(gòu)清晰:原本可能所有狀態(tài)的邏輯纵势,都集中或是分散在單個類里踱阿,真正去理解單個狀態(tài)的行為動作時管钳,會比較繁雜一些
2)將各個狀態(tài)獨(dú)立出來后钦铁,方便后續(xù)理解和維護(hù)

3. 缺點(diǎn)

1)會增加系統(tǒng)的類和實(shí)例的數(shù)量
2)單獨(dú)抽出狀態(tài)類后,可能會增加系統(tǒng)開發(fā)的復(fù)雜度
3)不是完全支持開閉原則才漆,添加新狀態(tài)牛曹,并切換狀態(tài)時,需要調(diào)整原有代碼

4. 結(jié)構(gòu)

  • 抽象狀態(tài)類: 定義一個接口醇滥,用以封裝各個狀態(tài)下的特定行為
  • 具體狀態(tài):實(shí)現(xiàn)抽象狀態(tài)所對應(yīng)的行為黎比,并在滿足條件的情況下切換狀態(tài)
  • 環(huán)境類:定義相關(guān)業(yè)務(wù)接口,并維護(hù)一個狀態(tài)引用

5. 實(shí)現(xiàn)

媽媽做飯的狀態(tài)可能是多種多樣的鸳玩,分開心的時候阅虫,生氣的時候,呵呵不跟。

package pattern.state;

//做飯狀態(tài)
interface CookState {
    public void cook(Context context);
}

//開心做飯狀態(tài)
class HappyCookState implements CookState {

    @Override
    public void cook(Context context) {
        String content = context.getContent();
        if(content.equals("我不喜歡吃蔬菜")){
            System.out.println("不喜歡吃颓帝,不能說,媽媽要生氣了");
            context.setCookState(new AngryCookState());
        }
    }
}

//生氣做飯狀態(tài)
class AngryCookState implements CookState {

    @Override
    public void cook(Context context) {
        String content = context.getContent();
        if(content.equals("你好漂亮")){
            System.out.println("媽媽開心了,說不定购城,還加個菜吕座,太棒了!");
            context.setCookState(new HappyCookState());
        }
    }
}

//環(huán)境
class Context {
    private CookState cookState; //保留的一個狀態(tài)引用
    private String content; //和媽媽交流的內(nèi)容
    
    public Context(){
        this.cookState = new HappyCookState();
    }
    
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    
    public CookState getCookState() {
        return cookState;
    }

    public void setCookState(CookState cookState) {
        this.cookState = cookState;
    }

    //接口外部請求
    public void talkHandler(String content){
        this.content = content;
        cookState.cook(this);
    }
}

public class StateTest {
    public static void main(String[] args) {
        Context context = new Context();
        context.talkHandler("我不喜歡吃蔬菜");
        context.talkHandler("你好漂亮");
    }
}
//不喜歡吃瘪板,不能說吴趴,媽媽要生氣了
//媽媽開心了,說不定侮攀,還加個菜锣枝,太棒了!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魏身,一起剝皮案震驚了整個濱河市惊橱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箭昵,老刑警劉巖税朴,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異家制,居然都是意外死亡正林,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門颤殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觅廓,“玉大人,你說我怎么就攤上這事涵但¤境瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵矮瘟,是天一觀的道長瞳脓。 經(jīng)常有香客問我,道長澈侠,這世上最難降的妖魔是什么劫侧? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮哨啃,結(jié)果婚禮上烧栋,老公的妹妹穿的比我還像新娘。我一直安慰自己拳球,他們只是感情好审姓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祝峻,像睡著了一般魔吐。 火紅的嫁衣襯著肌膚如雪次坡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天画畅,我揣著相機(jī)與錄音砸琅,去河邊找鬼。 笑死轴踱,一個胖子當(dāng)著我的面吹牛症脂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淫僻,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼诱篷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雳灵?” 一聲冷哼從身側(cè)響起棕所,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悯辙,沒想到半個月后琳省,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躲撰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年针贬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拢蛋。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡桦他,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谆棱,到底是詐尸還是另有隱情快压,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布垃瞧,位于F島的核電站蔫劣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏皆警。R本人自食惡果不足惜拦宣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一截粗、第九天 我趴在偏房一處隱蔽的房頂上張望信姓。 院中可真熱鬧,春花似錦绸罗、人聲如沸意推。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菊值。三九已至外驱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腻窒,已是汗流浹背昵宇。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儿子,地道東北人瓦哎。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像柔逼,于是被迫代替她去往敵國和親蒋譬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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