前言
状态设计模式系列文章
状态设计模式(一) - 定义
状态设计模式(二) - 订单状态一般方法实现
状态设计模式(三) - 订单状态状态设计模式实现
1. 需求
比如有一个订单,默认情况是待付款,付款之后变为发货,发货之后变为待收货
2. 一般实现方式
思路分析:
1>:定义一个Order订单状态的类,然后在类中定义待付款、已付款、待收货状态,然后定义付款方法pay()、发货方法deliverGoods()方法,然后在每个方法中根据对应状态进行判断:
a:在付款方法pay()方法中判断:
如果当前是待付款,就把当前状态置为已付款,然后调用支付,打印支付的log;
否则,打印一个不在状态的log;
b:在发货deliverGoods()方法中判断:
如果当前是已付款,就把当前状态置为待收货,然后调用发货,并且打印发货的log;
否则,打印一个不在状态的log;
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:22
* Version 1.0
* Params:
* Description: 假设现在写了3种状态,在第一个版本3个状态已经够了;
* 但是在第二个版本,增加了很多的状态,比如新增待评价状态或者其他的状态,那么就需要在下边新增好几个方法,并且每个方法中都会新增
* if...else...判断,比较麻烦,那么这个时候,就可以采用状态设计模式
*/
public class Order {
// 默认待付款状态
public final int OBLIGATION = 1 ;
// 已付款
public final int PAID = 2 ;
// 待收货
public final int WAITRECEIVING = 3 ;
// 订单状态
public int mStatus = OBLIGATION ;
// 付款
public void pay(){
if (mStatus == OBLIGATION){
// 付款之后,将状态置为已付款状态
mStatus = PAID ;
System.out.println("付款");
}else{
System.out.println("不在状态");
}
}
// 发货
public void deliverGoods(){
if (mStatus == PAID){
// 付款之后,将状态置为已付款状态
mStatus = WAITRECEIVING ;
System.out.println("发货");
}else{
System.out.println("不在状态");
}
}
}
2>:定义测试类Client:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/9 17:37
* Version 1.0
* Params:
* Description:
*/
public class Client {
public static void main(String[] args){
Order order = new Order() ;
order.pay();
order.deliverGoods();
// 打印结果:正常的情况
// 付款
// 发货
}
}
正常的打印顺序是:只能是先支付,然后发货,如果不支付,直接调用发货就会提示不在状态;
3. 缺点
这种做法缺点就是:假设现在写了3种状态,在第一个版本3个状态已经够了;但是在第二个版本,增加了很多的状态,比如新增待评价状态或者其他的状态,那么就需要在下边新增好几个方法,并且每个方法中都会新增if...else...判断,比较麻烦,那么下一节,我们就采用状态设计模式来对其进行实现