美文网首页
状态模式,一招帮你摆脱冗长的 if else

状态模式,一招帮你摆脱冗长的 if else

作者: 程就人生 | 来源:发表于2022-05-14 09:42 被阅读0次

    状态模式,该如何把状态提出来呢?

    状态模式,真的可以摆脱冗长的 if else 吗?

    状态模式(State Pattern),是把对象的状态属性,从对象里分离出来,每种状态作为一个单独的类,状态改变行为也改变的场景。它是一种行为型模式。

    业务场景:对象的行为依赖它的状态属性的场景。

    关键代码:创建表示各种状态的对象,和一个行为随状态对象而改变的上下文对象。

    下面看UML类图:


    类图说明:图中有六个类,订单状态接口类IOrderState;订单的四种状态实现类,待支付状态类NopayState,支付待发货状态类NoDeliverState,发货状态类DeliverState,订单状态完成类FinishState;还有一个订单类Order,订单状态就是从这个类中分离出去的。

    图中有两种关系:订单状态实现类及订单状态接口是实现关系,而订单状态与订单是相互依赖关系。模式之间最重要的就是类之间的关系了。

    下面看代码实现:

    1.订单状态接口;

    /**
     * 1.订单状态接口
     * @author 程就人生
     * @Date
     */
    public interface IOrderState {
      // 状态改变时做点什么
        public void doAction(Order order);
    }
    

    2.订单状态实现类;

    /**
     * 3.订单
     * @author 程就人生
     * @Date
     */
    public class Order {
    
      private IOrderState state;
      
      private String goodsName;
    
      public Order() {
        this.state = null;
      }
    
      public IOrderState getState() {
        return state;
      }
    
      public void setState(IOrderState state) {
        this.state = state;
      }
    
      public String getGoodsName() {
        return goodsName;
      }
    
      public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
      }    
    }
    

    3.订单类;

    /**
     * 3.订单
     * @author 程就人生
     * @Date
     */
    public class Order {
    
      private IOrderState state;
      
      private String goodsName;
    
      public Order() {
        this.state = null;
      }
    
      public IOrderState getState() {
        return state;
      }
    
      public void setState(IOrderState state) {
        this.state = state;
      }
    
      public String getGoodsName() {
        return goodsName;
      }
    
      public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
      }    
    }
    

    4.测试代码;

    public static void main(String[] argo){
        // 用户从电商平台的购物车点击一箱苹果,进入了结算页面
        Order order = new Order();
        order.setGoodsName("一箱苹果");    
        // 提交订单前犹豫了一下,没有付款
        IOrderState nopayState = new NopayState();
        nopayState.doAction(order);    
        order.setState(nopayState);
        // 再不付款,就要被取消了,还是付了吧
        IOrderState nodeliverState = new NodeliverState();
        nodeliverState.doAction(order);
        order.setState(nodeliverState);  
        // 商家收到付款提醒,赶紧发货
        IOrderState deliverState = new DeliverState();
        deliverState.doAction(order);
        order.setState(deliverState);  
        // 收到货物,点击确认收货按钮
        IOrderState finishState = new FinishState();
        finishState.doAction(order);
        order.setState(finishState);  
      }
    

    运行结果:

    用户订单:一箱苹果,未付款,未付款订单保留12小时,12小时后会被取消。
    用户订单:一箱苹果,已付款,商家正在备货。
    用户订单:一箱苹果,已发货,快递小哥快马加鞭配送中。
    用户订单:一箱苹果,已签收。
    

    这段代码的意思是:用户下了一个订单,但是没有支付,支付后等待发货,发货后等待收货,收货后点击签收完成。这就是一个订单的状态改变过程,它的状态每次发生变化时,总会影响订单行为的改变。这就是状态模式的简单实现。

    最后总结

    状态模式,可以解决使用 if else 判断状态并且状态过多的问题。对象的状态和对象分离后,又相互依赖,这也是违背了开闭原则的原因。没有完美的模式,用或不用,完全取决于取和舍。

    相关文章

      网友评论

          本文标题:状态模式,一招帮你摆脱冗长的 if else

          本文链接:https://www.haomeiwen.com/subject/edtqurtx.html