設(shè)計模式-狀態(tài)模式(十九)

狀態(tài)模式允許一個對象的內(nèi)部狀態(tài)改變的時候改變其行為
缺點是會造出大量的狀態(tài)類肩榕,優(yōu)點是使程序免于大量的條件轉(zhuǎn)移語句

  • 什么時候可以用?
  1. 對象的行為隨著狀態(tài)的改變而改變
  2. 對象的某一個方法里依賴于一重或多重的條件轉(zhuǎn)移語句

狀態(tài)模式和策略模式的區(qū)別:
考察環(huán)境角色是否有明顯的狀態(tài)和狀態(tài)的轉(zhuǎn)變蓄髓,有就用狀態(tài)模式缤弦,否則用策略模式,通過一個Context環(huán)境角色晰韵,使得各個原本一個環(huán)境只用一個策略類的可以用很多個了。

上類圖:


狀態(tài)模式.png

例子:

  • TCP


    image.png
  • 繪圖軟件


    image.png
  • 代碼示例:
    模擬購物的幾個動作,選擇商品鹏倘,生成訂單,付款取貨

  1. 先定義個接口
package com.byedbl.state;

/**
 *  A state interface
 *  用戶在網(wǎng)上購物的狀態(tài)變化:
 *  選擇商品 --> 生成訂單 --> 付款取貨
 */
public interface ShopState {
    void execute();
    void changeState(ShopContext c, AbstractShopState shopState);
}

changeState是為了內(nèi)部修改狀態(tài)方便的一個方法肺稀,允許子類自行決定下一個狀態(tài)是哪個第股,增加靈活性,當然也可以去掉话原,下面這個抽象類專門處理該方法夕吻。

  1. 抽象類處理changeState
package com.byedbl.state;

/**
 *  The parent class of state
 */
public abstract class AbstractShopState implements ShopState {
    public AbstractShopState() {
    }
    @Override
    public void changeState(ShopContext c, AbstractShopState s) {
        c.changeState(s);
    }
}
  1. 實現(xiàn)3個狀態(tài)的邏輯
    購物shop
package com.byedbl.state;
/**
 *  A concrete state for customer shopping
 */
public class Shop extends AbstractShopState {
    private static Shop shop;
    private Shop() {
    }
    static {
        shop = new Shop();
    }
    public static Shop getInstance() {
        return shop;
    }
    @Override
    public void execute() {
        System.out.println("The state is shopping now !");
    }
}

生成訂單

package com.byedbl.state;
/**
 *  A concrete state for generating bill
 */
public class GenerateBill extends AbstractShopState {
    private static GenerateBill generateBill;
    static {
        generateBill = new GenerateBill();
    }

    private GenerateBill() {
    }
    public static GenerateBill getInstance() {
        return generateBill;
    }
    @Override
    public void execute() {
        System.out.println("The state is generating bill now !");
    }
}

付款

package com.byedbl.state;
/**
 *  A concrete state for customer shopping
 */
public class Pay extends AbstractShopState {
    private static Pay  pay ;
    static {
        pay = new Pay();
    }
    private Pay() {
    }
    public static Pay getInstance() {
        return pay;
    }
    @Override
    public void execute() {
        System.out.println("The state is pay now !");
    }
}
  1. 環(huán)境角色類
package com.byedbl.state;

/**
 *  The context for user useing
 */
public class ShopContext  {
    private ShopState currentState;
    public ShopContext() {
    }
    public void changeState(ShopState s) {
        currentState = s;
    }
    public void shop() {
        currentState.execute();
    }
    public void generateBill() {
        currentState.execute();
    }
    public void pay() {
        currentState.execute();
    }
}
  1. 客戶端用法
package com.byedbl.state;

/**
 *  A test client
 */
public class Test  {
    public static void main(String[] args) {
        ShopContext myContext = new ShopContext();
        AbstractShopState myShop = Shop.getInstance();
        AbstractShopState myGenBill = GenerateBill.getInstance();
        AbstractShopState myPay = Pay.getInstance();
        
        myContext.changeState(myShop);
        myContext.shop();

        myContext.changeState(myGenBill);
        myContext.generateBill();
        
        myContext.changeState(myPay);
        myContext.pay();

        myShop.changeState(myContext, myPay);
        myContext.pay();
    }
}

狀態(tài)模式關(guān)鍵是一個環(huán)境角色,這個角色使得可以各個狀態(tài)可以自由切換繁仁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涉馅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子黄虱,更是在濱河造成了極大的恐慌稚矿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捻浦,死亡現(xiàn)場離奇詭異晤揣,居然都是意外死亡,警方通過查閱死者的電腦和手機朱灿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門昧识,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盗扒,你說我怎么就攤上這事跪楞∽喝ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵甸祭,是天一觀的道長缕碎。 經(jīng)常有香客問我,道長池户,這世上最難降的妖魔是什么咏雌? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮煞檩,結(jié)果婚禮上处嫌,老公的妹妹穿的比我還像新娘。我一直安慰自己斟湃,他們只是感情好熏迹,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凝赛,像睡著了一般注暗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓猎,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天捆昏,我揣著相機與錄音,去河邊找鬼毙沾。 笑死骗卜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的左胞。 我是一名探鬼主播寇仓,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烤宙!你這毒婦竟也來了遍烦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躺枕,失蹤者是張志新(化名)和其女友劉穎服猪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拐云,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡罢猪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉瘩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳帕。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖房揭,靈堂內(nèi)的尸體忽然破棺而出备闲,到底是詐尸還是另有隱情,我是刑警寧澤捅暴,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布恬砂,位于F島的核電站,受9級特大地震影響蓬痒,放射性物質(zhì)發(fā)生泄漏泻骤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一梧奢、第九天 我趴在偏房一處隱蔽的房頂上張望狱掂。 院中可真熱鬧,春花似錦亲轨、人聲如沸趋惨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽器虾。三九已至,卻和暖如春蹦锋,著一層夾襖步出監(jiān)牢的瞬間兆沙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工莉掂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葛圃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓憎妙,卻偏偏與公主長得像库正,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尚氛,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • 設(shè)計模式匯總 一诀诊、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,948評論 1 15
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,395評論 8 265
  • 淫欲妨害煞:八專、九丑 【八專乃甲寅讯柔、乙卯抡蛙、己未、丁未魂迄、庚申粗截、辛酉、戊戌捣炬、癸丑.】 日上有不正之妻熊昌,時上有不正之子...
    2d151b87fc07閱讀 44,046評論 0 1
  • 沒錯绽榛,一旦閑下來,就發(fā)現(xiàn)自己太孤單婿屹。 以前的時候灭美,大家都沒有男朋友,還時常聯(lián)系昂利。如今届腐,工作了談對象了,朋友...
    閑敲棋子落燈花兒閱讀 126評論 0 0
  • 葉酸 又有同學要結(jié)婚了. 讓我給講講經(jīng)驗蜂奸,我怕他記不住犁苏,就寫下來,給他們做參考扩所!
    子持子持閱讀 137評論 0 0