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



作者:世道无情
链接:https://www.jianshu.com/p/06e8e39ac030
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


最后修改:2021 年 02 月 08 日
如果觉得我的文章对你有用,请随意赞赏