在介绍状态模式之前,我们先看个简单的例子
比如我们正常的网上购物的订单,对于订单它有许多个不同的状态,在不同状态下会有不同的行为能力,如状态有待支付、已支付待发货、待收货、订单完成等等,在整个订单流转过程中,由不同的事件行为导致它状态的变更,可以看下它简单的状态图
这些状态虽然不同,但是都是属于订单的状态,对应的行为也是订单的行为,在编码的过程中,一种写法是将这些行为(方法)都写到订单这个类或者类似OrderService这种类中,如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class OrderService { private OrderDao orderDao;
public void pay(Long orderId) { Order order = orderDao.findById(orderId); if (order.getStatus() == OrderStatus.WAIT_PAY) { } else if (order.getStatus() == OrderStatus.PAYING) { } else if (order.getStatus() == OrderStauts.PART_PAID) { } else { } } }
|
这样每次进行操作时,我们要先进行一下当前状态的判断,如用户支付时,我们要判断一下当前订单的状态,如果是待支付,则进行支付操作后,将状态改为已支付;如果当前状态是已支付时,就要提示用户当前订单已支付,不能再次支付等等,如果订单状态比较复杂时就会导致这个类中充斥大量的if
、switch
等判断逻辑,维护不便
而状态模式则提供了另一种解决方案,它将与特定状态相关的行为局部化,也使得状态转换现实化,下面我我们来具体看一下