状态机实现-使用状态设计模式,使用场景

原理:使用的是设计模式中的状态模式。

优点:利于扩展,写更多的状态也没问题,不用各种ifelse的条件判断,缺点:需要每个状态写一个类

假设我都我有一个订单,其中有几个状态:下单、配送、完成

我要严格控制这几个状态的变更、环节日志的记录、任务日志的记录等,当然还可以有别的操作,比如发短信

订单状态

public interface OrderState {

   /**

    * 已下单

    */

   String PLACED = "order_placed";

   /**

    * 配送中

    */

   String ORDER_DELIVERING = "order_delivering";

   /**

    * 已完成/收货

    */

   String FINISHED = "order_finished";

}

状态基类

@Getter

@Setter

public abstract class OrderInfoState {



   protected OrderInfo orderInfo;



   public String getOrderState() {

       return "order_placed";

   }



   abstract void printFlowLog();



   abstract void printTaskLog();



}

完成状态

public class OrderFinishState extends OrderInfoState {



   @Override

   public String getOrderState() {

       return OrderState.FINISHED;

   }



   @Override

   void printFlowLog() {

       System.out.println("订单已经完成");

   }



   @Override

   void printTaskLog() {

       System.out.println("订单已经竣工");

   }

}

配送状态

public class OrderDispatchState extends OrderInfoState {



   @Override

   public String getOrderState() {

       if(!OrderState.PLACED.equals(orderInfo.getOrderState())) {

           throw new UserClientException("目前状态是" + orderInfo.getOrderState()+"不能推进到派单环节");

       }

       return OrderState.ORDER_DELIVERING;

   }



   @Override

   void printFlowLog() {

       System.out.println("xxx工程师准备正在上门");

   }



   @Override

   void printTaskLog() {

       System.out.println("派单给xxx");

   }

}

下单状态

public class OrderPlaceState extends OrderInfoState {



   @Override

   public String getOrderState() {

       return OrderState.PLACED;

   }



   @Override

   void printFlowLog() {

       System.out.println("您已经下单了");

   }



   @Override

   void printTaskLog() {

       System.out.println("已经下单了");

   }

}

订单实体类

@Getter

@Setter

public class OrderInfo extends LongAuditModel<OrderInfo> {



   /**

    * 订单状态

    */

   @TableField(value = "order_state")

   private String orderState;



   public void changeState(OrderInfoState state) {

       state.setOrderInfo(this);

       setOrderState(state.getOrderState());

       state.printFlowLog();

       state.printTaskLog();

       System.out.println(getOrderState());

   }



}

使用:

public class Test {



   public static void main(String[] args) {

      OrderInfo orderInfo = new OrderInfo();

       orderInfo.changeState(new OrderPlaceState());  //修改为下单状态

       orderInfo.changeState(new OrderDispatchState());  //修改为配送状态

       orderInfo.changeState(new OrderFinishState());  //修改为完成状态

   }

}

------------运行结果-------------

您已经下单了

已经下单了

order_placed

xxx工程师准备正在上门

派单给xxx

order_delivering

订单已经完成

订单已经竣工

order_finished

总结:

不使用这样的状态模式当然可以达到功能,但是会有一些ifelse或者switch的条件判断,状态越多语句越多,需要做的功能越多代码也越多,比较凌乱。

像这样使用状态模式会大大增强代码的阅读性,代码质量,特别是状态和功能点多或者状态变更每次都有前状态要求时,用此方法是比较好的。但是状态少功能点少可以就没必要了

读者可根据自身情况自行选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值