• 第三节:状态模式——订单审批流程分析


    一、借贷平台代码分析

      1、借贷平台的订单,有审核-发布-抢单 等步骤,随着操作的不同,会改变订单的状态,项目中的这个模块实现就会使用到状态模式;

      2、通常使用 if/else 判断订单的状态,从而实现不同的逻辑,伪代码如下:

        

         

     

    二、代码分析

      1、类图

      2、代码

        状态接口类:

     1 /**
     2  * 状态接口
     3  * @author Administrator
     4  *
     5  */
     6 public interface State {
     7 
     8     /**
     9      * 电审
    10      */
    11     void checkEvent(Context context);
    12 
    13     /**
    14      * 电审失败
    15      */
    16     void checkFailEvent(Context context);
    17 
    18     /**
    19      * 定价发布
    20      */
    21     void makePriceEvent(Context context);
    22 
    23     /**
    24      * 接单
    25      */
    26     void acceptOrderEvent(Context context);
    27 
    28     /**
    29      * 无人接单失效
    30      */
    31     void notPeopleAcceptEvent(Context context);
    32 
    33     /**
    34      * 付款
    35      */
    36     void payOrderEvent(Context context);
    37 
    38     /**
    39      * 接单有人支付失效
    40      */
    41     void orderFailureEvent(Context context);
    42 
    43     /**
    44      * 反馈
    45      */
    46     void feedBackEvent(Context context);
    47 
    48 
    49     String getCurrentState();
    50 }

        抽象状态类:

     1 public abstract class AbstractState implements State {
     2 
     3     protected static final RuntimeException EXCEPTION = new RuntimeException("操作流程不允许");
     4 
     5     //抽象类,默认实现了 State 接口的所有方法
     6     //该类的所有方法,其子类(具体的状态类),可以有选择的进行重写
     7 
     8     @Override
     9     public void checkEvent(Context context) {
    10         throw EXCEPTION;
    11     }
    12 
    13     @Override
    14     public void checkFailEvent(Context context) {
    15         throw EXCEPTION;
    16     }
    17 
    18     @Override
    19     public void makePriceEvent(Context context) {
    20         throw EXCEPTION;
    21     }
    22 
    23     @Override
    24     public void acceptOrderEvent(Context context) {
    25         throw EXCEPTION;
    26     }
    27 
    28     @Override
    29     public void notPeopleAcceptEvent(Context context) {
    30         throw EXCEPTION;
    31     }
    32 
    33     @Override
    34     public void payOrderEvent(Context context) {
    35         throw EXCEPTION;
    36     }
    37 
    38     @Override
    39     public void orderFailureEvent(Context context) {
    40         throw EXCEPTION;
    41     }
    42 
    43     @Override
    44     public void feedBackEvent(Context context) {
    45         throw EXCEPTION;
    46     }
    47 }

        各个状态实现类:

     1 //各种具体状态类
     2 class FeedBackState extends AbstractState {
     3 
     4     @Override
     5     public String getCurrentState() {
     6         return StateEnum.FEED_BACKED.getValue();
     7     }
     8 }
     9 
    10 class GenerateState extends AbstractState {
    11 
    12     @Override
    13     public void checkEvent(Context context) {
    14         context.setState(new ReviewState());
    15     }
    16 
    17     @Override
    18     public void checkFailEvent(Context context) {
    19         context.setState(new FeedBackState());
    20     }
    21 
    22     @Override
    23     public String getCurrentState() {
    24         return StateEnum.GENERATE.getValue();
    25     }
    26 }
    27 
    28 class NotPayState extends AbstractState {
    29 
    30     @Override
    31     public void payOrderEvent(Context context) {
    32         context.setState(new PaidState());
    33     }
    34 
    35     @Override
    36     public void feedBackEvent(Context context) {
    37         context.setState(new FeedBackState());
    38     }
    39 
    40     @Override
    41     public String getCurrentState() {
    42         return StateEnum.NOT_PAY.getValue();
    43     }
    44 }
    45 
    46 class PaidState extends AbstractState {
    47 
    48     @Override
    49     public void feedBackEvent(Context context) {
    50         context.setState(new FeedBackState());
    51     }
    52 
    53     @Override
    54     public String getCurrentState() {
    55         return StateEnum.PAID.getValue();
    56     }
    57 }
    58 
    59 class PublishState extends AbstractState {
    60 
    61     @Override
    62     public void acceptOrderEvent(Context context) {
    63         //把当前状态设置为  NotPayState。。。
    64         //至于应该变成哪个状态,有流程图来决定
    65         context.setState(new NotPayState());
    66     }
    67 
    68     @Override
    69     public void notPeopleAcceptEvent(Context context) {
    70         context.setState(new FeedBackState());
    71     }
    72 
    73     @Override
    74     public String getCurrentState() {
    75         return StateEnum.PUBLISHED.getValue();
    76     }
    77 }
    78 
    79 class ReviewState extends AbstractState {
    80 
    81     @Override
    82     public void makePriceEvent(Context context) {
    83         context.setState(new PublishState());
    84     }
    85 
    86     @Override
    87     public String getCurrentState() {
    88         return StateEnum.REVIEWED.getValue();
    89     }
    90 
    91 }

        状态枚举类:

     1 /**
     2  * 状态枚举类
     3  * @author Administrator
     4  *
     5  */
     6 public enum StateEnum {
     7 
     8     //订单生成
     9     GENERATE(1, "GENERATE"),
    10 
    11     //已审核
    12     REVIEWED(2, "REVIEWED"),
    13 
    14     //已发布
    15     PUBLISHED(3, "PUBLISHED"),
    16 
    17     //待付款
    18     NOT_PAY(4, "NOT_PAY"),
    19 
    20     //已付款
    21     PAID(5, "PAID"),
    22 
    23     //已完结
    24     FEED_BACKED(6, "FEED_BACKED");
    25 
    26     private int key;
    27     private String value;
    28 
    29     StateEnum(int key, String value) {
    30         this.key = key;
    31         this.value = value;
    32     }
    33     public int getKey() {return key;}
    34     public String getValue() {return value;}
    35 }

        Context 上下文对象:

     1 //环境上下文
     2 public class Context extends AbstractState {
     3     //当前的状态 state, 根据我们的业务流程处理,不停的变化
     4     private State state;
     5 
     6     @Override
     7     public void checkEvent(Context context) {
     8         state.checkEvent(this);
     9         getCurrentState();
    10     }
    11 
    12     @Override
    13     public void checkFailEvent(Context context) {
    14         state.checkFailEvent(this);
    15         getCurrentState();
    16     }
    17 
    18     @Override
    19     public void makePriceEvent(Context context) {
    20         state.makePriceEvent(this);
    21         getCurrentState();
    22     }
    23 
    24     @Override
    25     public void acceptOrderEvent(Context context) {
    26         state.acceptOrderEvent(this);
    27         getCurrentState();
    28     }
    29 
    30     @Override
    31     public void notPeopleAcceptEvent(Context context) {
    32         state.notPeopleAcceptEvent(this);
    33         getCurrentState();
    34     }
    35 
    36     @Override
    37     public void payOrderEvent(Context context) {
    38         state.payOrderEvent(this);
    39         getCurrentState();
    40     }
    41 
    42     @Override
    43     public void orderFailureEvent(Context context) {
    44         state.orderFailureEvent(this);
    45         getCurrentState();
    46     }
    47 
    48     @Override
    49     public void feedBackEvent(Context context) {
    50         state.feedBackEvent(this);
    51         getCurrentState();
    52     }
    53 
    54     public State getState() {
    55         return state;
    56     }
    57 
    58     public void setState(State state) {
    59         this.state = state;
    60     }
    61 
    62     @Override
    63     public String getCurrentState() {
    64         System.out.println("当前状态 : " + state.getCurrentState());
    65         return state.getCurrentState();
    66     }
    67 }

        客户端:

     1 /**测试类*/
     2 public class ClientTest {
     3 
     4     public static void main(String[] args) {
     5         //创建context 对象
     6         Context context = new Context();
     7         //将当前状态设置为 PublishState
     8         context.setState(new PublishState());
     9         System.out.println(context.getCurrentState());
    10 
    11 //        //publish --> not pay
    12         context.acceptOrderEvent(context);
    13 //        //not pay --> paid
    14         context.payOrderEvent(context);
    15 //        // 失败, 检测失败时,会抛出异常
    16 //        try {
    17 //            context.checkFailEvent(context);
    18 //            System.out.println("流程正常..");
    19 //        } catch (Exception e) {
    20 //            System.out.println(e.getMessage());
    21 //        }
    22 
    23     }
    24 
    25 }
  • 相关阅读:
    acwing793. 高精度乘法
    acwing788. 逆序对的数量
    acwing791. 高精度加法
    acwing787. 归并排序
    acwing789. 数的范围
    acwing790. 数的三次方根
    acwing786. 第k个数
    acwing792. 高精度减法
    1.9
    课程总结
  • 原文地址:https://www.cnblogs.com/niujifei/p/14466286.html
Copyright © 2020-2023  润新知