前言
状态设计模式系列文章
状态设计模式(一) - 定义
状态设计模式(二) - 订单状态一般方法实现
状态设计模式(三) - 订单状态状态设计模式实现
1. 需求
比如有一个订单,默认情况是待付款,付款之后变为发货,发货之后变为待收货
2. 状态设计模式实现
思路分析:
1>:定义订单状态接口,并且每个状态下调用对应的方法,为了方便测试,这里只是定义支付pay()、发货deliverGoods()方法;
2>:定义三种状态待付款、发货、待收货状态的类,让其分别实现订单状态接口,然后复写所有的方法,这里只有支付pay()、发货deliverGoods()方法;
3>:定义基类BaseOrder订单的类,目的是在执行完某个状态下的方法之后,然后设置当前订单的状态;
4>:单独定义一个 订单的Order类,让这个类继承BaseOrder,并且实现订单状态接口,在这个类中:
a:构造方法表示默认的订单状态是待付款;
b:在支付pay()方法中,调用mStatus.pay()之后,就调用BaseOrder的设置状态的方法,将状态设置为已支付状态;
c:在发货deliverGoods()方法中,调用mStatus.deliverGoods()之后,就调用BaseOrder的设置状态的方法,将状态设置为待收货状态;
5>:定义测试类Client,测试状态设计模式的订单状态;
3. 代码如下
1>:定义订单状态接口,并且每个状态下调用对应的方法,为了方便测试,这里只是定义支付pay()、发货deliverGoods()方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:38
* Version 1.0
* Params:
* Description: 订单状态下调用对应的方法
*/
public interface OrderOperateStatus {
// 支付
void pay() ;
// 发货
void deliverGoods() ;
}
2>:定义三种状态待付款、发货、待收货状态的类,让其分别实现订单状态接口,然后复写所有的方法,这里只有支付pay()、发货deliverGoods()方法:
a:待付款状态:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:40
* Version 1.0
* Params:
* Description: 待付款状态下的操作
*/
public class ObligationStatus implements OrderOperateStatus {
@Override
public void pay() {
// 在待付款状态下的类,就需要调用支付的方法
System.out.println("支付成功");
}
@Override
public void deliverGoods() {
// 待付款状态下的类,不能发货,只能先支付
System.out.println("不在状态");
}
}
b:付款状态:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:40
* Version 1.0
* Params:
* Description: 付款状态下的操作
*/
public class PaidStatus implements OrderOperateStatus {
@Override
public void pay() {
// 付款之后,在付款状态下的类就不能重复付款
System.out.println("不要重复支付");
}
@Override
public void deliverGoods() {
// 付款之后,就需要发货
System.out.println("发货成功");
}
}
c:待收货状态
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:40
* Version 1.0
* Params:
* Description: 待收货状态下的操作
*/
public class WaitReceivingStatus implements OrderOperateStatus {
@Override
public void pay() {
// 待收货状态下,就不能再付款了,因为已经付款了
System.out.println("不在状态");
}
@Override
public void deliverGoods() {
// 待收货状态下,就不能在发货了,因为已经发货了
System.out.println("不在状态");
}
}
3>:定义基类BaseOrder订单的类,目的是在执行完某个状态下的方法之后,然后设置当前订单的状态:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 18:03
* Version 1.0
* Params:
* Description: 在执行完某个状态下的方法之后,然后设置当前订单的状态
*/
public class BaseOrder {
protected OrderOperateStatus mStatus ;
public void setStatus(OrderOperateStatus status){
this.mStatus = status ;
}
}
4>:单独定义一个 订单的Order类,让这个类继承BaseOrder,并且实现订单状态接口,在这个类中:
a:构造方法表示默认的订单状态是待付款;
b:在支付pay()方法中,调用mStatus.pay()之后,就调用BaseOrder的设置状态的方法,将状态设置为已支付状态;
c:在发货deliverGoods()方法中,调用mStatus.deliverGoods()之后,就调用BaseOrder的设置状态的方法,将状态设置为待收货状态:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 18:04
* Version 1.0
* Params:
* Description: 订单的所有状态的类
*/
public class Order extends BaseOrder implements OrderOperateStatus {
public Order(){
// 默认的状态
mStatus = new ObligationStatus() ;
}
@Override
public void pay() {
mStatus.pay();
// 当前下的状态调用支付,然后把当前状态设置为已支付的状态
setStatus(new PaidStatus());
}
@Override
public void deliverGoods() {
mStatus.deliverGoods();
// 发货之后,把状态置为待收货状态
setStatus(new WaitReceivingStatus());
}
}
5>:定义测试类Client,测试状态设计模式的订单状态:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 18:29
* Version 1.0
* Params:
* Description: 状态设计模式测试订单状态
*/
public class Client {
public static void main(String[] args){
// 创建Order订单对象
Order order = new Order() ;
// 先调用支付,再调用发货
order.pay();
order.deliverGoods();
}
}
以上就是采用状态设计模式实现订单的各种状态
具体代码已上传至github:
https://github.com/shuai999/Architect_day21.git