状态设计模式(二) - 订单状态一般方法实现

前言

状态设计模式系列文章
状态设计模式(一) - 定义
状态设计模式(二) - 订单状态一般方法实现
状态设计模式(三) - 订单状态状态设计模式实现

1. 需求


比如有一个订单,默认情况是待付款,付款之后变为发货,发货之后变为待收货

2. 一般实现方式


思路分析:
1>:定义一个Order订单状态的类,然后在类中定义待付款、已付款、待收货状态,然后定义付款方法pay()、发货方法deliverGoods()方法,然后在每个方法中根据对应状态进行判断:
a:在付款方法pay()方法中判断:
如果当前是待付款,就把当前状态置为已付款,然后调用支付,打印支付的log;
否则,打印一个不在状态的log;
b:在发货deliverGoods()方法中判断:
如果当前是已付款,就把当前状态置为待收货,然后调用发货,并且打印发货的log;
否则,打印一个不在状态的log;

/**
 * Email: [email protected]
 * 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: [email protected]
 * 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...判断,比较麻烦,那么下一节,我们就采用状态设计模式来对其进行实现

你可能感兴趣的:(状态设计模式(二) - 订单状态一般方法实现)