狀態(tài)設(shè)計(jì)模式(三) - 訂單狀態(tài)狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)

前言

狀態(tài)設(shè)計(jì)模式系列文章
狀態(tài)設(shè)計(jì)模式(一) - 定義
狀態(tài)設(shè)計(jì)模式(二) - 訂單狀態(tài)一般方法實(shí)現(xiàn)
狀態(tài)設(shè)計(jì)模式(三) - 訂單狀態(tài)狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)

1. 需求


比如有一個(gè)訂單所袁,默認(rèn)情況是待付款眯牧,付款之后變?yōu)榘l(fā)貨,發(fā)貨之后變?yōu)榇肇?/p>

2. 狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)


思路分析:
1>:定義訂單狀態(tài)接口稽揭,并且每個(gè)狀態(tài)下調(diào)用對(duì)應(yīng)的方法俊嗽,為了方便測(cè)試,這里只是定義支付pay()、發(fā)貨deliverGoods()方法蔑祟;
2>:定義三種狀態(tài)待付款、發(fā)貨沉唠、待收貨狀態(tài)的類疆虚,讓其分別實(shí)現(xiàn)訂單狀態(tài)接口,然后復(fù)寫所有的方法满葛,這里只有支付pay()径簿、發(fā)貨deliverGoods()方法;
3>:定義基類BaseOrder訂單的類嘀韧,目的是在執(zhí)行完某個(gè)狀態(tài)下的方法之后篇亭,然后設(shè)置當(dāng)前訂單的狀態(tài);
4>:?jiǎn)为?dú)定義一個(gè) 訂單的Order類锄贷,讓這個(gè)類繼承BaseOrder译蒂,并且實(shí)現(xiàn)訂單狀態(tài)接口,在這個(gè)類中:
a:構(gòu)造方法表示默認(rèn)的訂單狀態(tài)是待付款谊却;
b:在支付pay()方法中柔昼,調(diào)用mStatus.pay()之后,就調(diào)用BaseOrder的設(shè)置狀態(tài)的方法炎辨,將狀態(tài)設(shè)置為已支付狀態(tài)捕透;
c:在發(fā)貨deliverGoods()方法中,調(diào)用mStatus.deliverGoods()之后蹦魔,就調(diào)用BaseOrder的設(shè)置狀態(tài)的方法激率,將狀態(tài)設(shè)置為待收貨狀態(tài);
5>:定義測(cè)試類Client勿决,測(cè)試狀態(tài)設(shè)計(jì)模式的訂單狀態(tài)乒躺;

3. 代碼如下


1>:定義訂單狀態(tài)接口,并且每個(gè)狀態(tài)下調(diào)用對(duì)應(yīng)的方法低缩,為了方便測(cè)試嘉冒,這里只是定義支付pay()、發(fā)貨deliverGoods()方法:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 17:38
 * Version 1.0
 * Params:
 * Description:    訂單狀態(tài)下調(diào)用對(duì)應(yīng)的方法
*/

public interface OrderOperateStatus {
    // 支付
    void pay() ;
    // 發(fā)貨
    void deliverGoods() ;
}
2>:定義三種狀態(tài)待付款咆繁、發(fā)貨讳推、待收貨狀態(tài)的類,讓其分別實(shí)現(xiàn)訂單狀態(tài)接口玩般,然后復(fù)寫所有的方法银觅,這里只有支付pay()、發(fā)貨deliverGoods()方法:

a:待付款狀態(tài):

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 17:40
 * Version 1.0
 * Params:
 * Description:    待付款狀態(tài)下的操作
*/

public class ObligationStatus implements OrderOperateStatus {

    @Override
    public void pay() {
        // 在待付款狀態(tài)下的類坏为,就需要調(diào)用支付的方法
        System.out.println("支付成功");
    }

    @Override
    public void deliverGoods() {
        // 待付款狀態(tài)下的類究驴,不能發(fā)貨镊绪,只能先支付
        System.out.println("不在狀態(tài)");
    }
}

b:付款狀態(tài):

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 17:40
 * Version 1.0
 * Params:
 * Description:    付款狀態(tài)下的操作
*/

public class PaidStatus implements OrderOperateStatus {

    @Override
    public void pay() {
        // 付款之后,在付款狀態(tài)下的類就不能重復(fù)付款
        System.out.println("不要重復(fù)支付");
    }

    @Override
    public void deliverGoods() {
        // 付款之后洒忧,就需要發(fā)貨
        System.out.println("發(fā)貨成功");
    }
}

c:待收貨狀態(tài)

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 17:40
 * Version 1.0
 * Params:
 * Description:    待收貨狀態(tài)下的操作
*/

public class WaitReceivingStatus implements OrderOperateStatus {

    @Override
    public void pay() {
        // 待收貨狀態(tài)下蝴韭,就不能再付款了,因?yàn)橐呀?jīng)付款了
        System.out.println("不在狀態(tài)");
    }

    @Override
    public void deliverGoods() {
        // 待收貨狀態(tài)下熙侍,就不能在發(fā)貨了榄鉴,因?yàn)橐呀?jīng)發(fā)貨了
        System.out.println("不在狀態(tài)");
    }
}
3>:定義基類BaseOrder訂單的類,目的是在執(zhí)行完某個(gè)狀態(tài)下的方法之后蛉抓,然后設(shè)置當(dāng)前訂單的狀態(tài):
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 18:03
 * Version 1.0
 * Params:
 * Description:    在執(zhí)行完某個(gè)狀態(tài)下的方法之后庆尘,然后設(shè)置當(dāng)前訂單的狀態(tài)
*/

public class BaseOrder {
    protected OrderOperateStatus mStatus ;

    public void setStatus(OrderOperateStatus status){
        this.mStatus = status ;
    }
}
4>:?jiǎn)为?dú)定義一個(gè) 訂單的Order類,讓這個(gè)類繼承BaseOrder芝雪,并且實(shí)現(xiàn)訂單狀態(tài)接口减余,在這個(gè)類中:

a:構(gòu)造方法表示默認(rèn)的訂單狀態(tài)是待付款;
b:在支付pay()方法中惩系,調(diào)用mStatus.pay()之后位岔,就調(diào)用BaseOrder的設(shè)置狀態(tài)的方法,將狀態(tài)設(shè)置為已支付狀態(tài)堡牡;
c:在發(fā)貨deliverGoods()方法中抒抬,調(diào)用mStatus.deliverGoods()之后,就調(diào)用BaseOrder的設(shè)置狀態(tài)的方法晤柄,將狀態(tài)設(shè)置為待收貨狀態(tài):

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 18:04
 * Version 1.0
 * Params:
 * Description:    訂單的所有狀態(tài)的類
*/

public class Order extends BaseOrder implements OrderOperateStatus {

    public Order(){
        // 默認(rèn)的狀態(tài)
        mStatus = new ObligationStatus() ;
    }


    @Override
    public void pay() {
        mStatus.pay();
        // 當(dāng)前下的狀態(tài)調(diào)用支付擦剑,然后把當(dāng)前狀態(tài)設(shè)置為已支付的狀態(tài)
        setStatus(new PaidStatus());
    }

    @Override
    public void deliverGoods() {
        mStatus.deliverGoods();
        // 發(fā)貨之后,把狀態(tài)置為待收貨狀態(tài)
        setStatus(new WaitReceivingStatus());
    }
}
5>:定義測(cè)試類Client芥颈,測(cè)試狀態(tài)設(shè)計(jì)模式的訂單狀態(tài):
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 18:29
 * Version 1.0
 * Params:
 * Description:    狀態(tài)設(shè)計(jì)模式測(cè)試訂單狀態(tài)
*/

public class Client {
    public static void main(String[] args){

        // 創(chuàng)建Order訂單對(duì)象
        Order order = new Order() ;
        // 先調(diào)用支付惠勒,再調(diào)用發(fā)貨
        order.pay();
        order.deliverGoods();
    }
}

以上就是采用狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)訂單的各種狀態(tài)

具體代碼已上傳至github:
https://github.com/shuai999/Architect_day21.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬坑,隨后出現(xiàn)的幾起案子纠屋,更是在濱河造成了極大的恐慌,老刑警劉巖盾计,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件售担,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡署辉,警方通過(guò)查閱死者的電腦和手機(jī)族铆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哭尝,“玉大人哥攘,你說(shuō)我怎么就攤上這事。” “怎么了献丑?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵末捣,是天一觀的道長(zhǎng)侠姑。 經(jīng)常有香客問(wèn)我创橄,道長(zhǎng),這世上最難降的妖魔是什么莽红? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任妥畏,我火速辦了婚禮,結(jié)果婚禮上安吁,老公的妹妹穿的比我還像新娘醉蚁。我一直安慰自己,他們只是感情好鬼店,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布网棍。 她就那樣靜靜地躺著,像睡著了一般妇智。 火紅的嫁衣襯著肌膚如雪滥玷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天巍棱,我揣著相機(jī)與錄音惑畴,去河邊找鬼。 笑死航徙,一個(gè)胖子當(dāng)著我的面吹牛如贷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播到踏,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杠袱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窝稿?” 一聲冷哼從身側(cè)響起楣富,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讹躯,沒(méi)想到半個(gè)月后菩彬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮梯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年骗灶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉馏。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耙旦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萝究,到底是詐尸還是另有隱情免都,我是刑警寧澤锉罐,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站绕娘,受9級(jí)特大地震影響脓规,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜险领,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一侨舆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绢陌,春花似錦挨下、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秤掌,卻和暖如春愁铺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背机杜。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工帜讲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椒拗。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓似将,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚀苛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子在验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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