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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。