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

2022-05-14  本文已影响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 判断状态并且状态过多的问题。对象的状态和对象分离后,又相互依赖,这也是违背了开闭原则的原因。没有完美的模式,用或不用,完全取决于取和舍。

上一篇下一篇

猜你喜欢

热点阅读