前言
狀態(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