一、概念
- 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。
- 一个对象“看起来好像修改了它的类”是什么意思呢?从客户的视角来看:如果说你使用的对象能够完全改变它的行为,那么你会觉得,这个对象实际上是从别的类实例化而来的。然而,实际上,状态模式是在使用组合通过简单引用不同的状态对象来造成类改变的假象。
- 角色:
1、上下文(Context): 定义客户感兴趣的接口。通常负责具体状态的切换。维护多个 ConcreteState 子类的实例,每个实例分别代表不同的状态。
2、抽象状态类(State): 定义一个接口或抽象类以封装与 Context 的状态相关的行为。
3、具体状态类(ConcreteState): 实现 State,实现与 Context 的一个状态相关的行为。每个 ConcreteState 都表示 Context 的一个状态。

1、抽象状态类
* @Description: 抽象状态 * @author: cuixiuyin * @date: 2019/01/16 08:57 */ public interface State { /*** * @Description 乘客下单,订单创建 * @author cuixiuyin * @date 2019/01/16 08:59 */ void orderCreate(); /*** * @Description 乘客取消,订单取消 * @author cuixiuyin * @date 2019/01/16 08:59 */ void orderCancel(); /*** * @Description 司机接单,订单匹配 * @author cuixiuyin * @date 2019/01/16 08:59 */ void orderMatch(); /*** * @Description 乘客评价,订单结束 * @author cuixiuyin * @date 2019/01/16 08:59 */ void evaluation(); }这里,我们定义了一个抽象状态类,封装了与 Context 的状态有关的行为 —— 乘客下单、乘客取消、司机接单、乘客评价。
2、具体状态类
- New 状态:
public class NewState implements State { private Order order; public NewState(Order order) { this.order = order; } @Override public void orderCreate() { System.out.println("您有一个订单等待司机接单,不可新建订单"); } @Override public void orderCancel() { System.out.println("乘客取消订单,订单取消中..."); // 改变状态 New -> Cancel order.setState(order.getCancelState()); } @Override public void orderMatch() { System.out.println("司机接单中..."); // 改变状态 New -> Running order.setState(order.getRunningState()); } @Override public void evaluation() { System.out.println("新创建订单,不可评价"); } }- Cancel 状态:
public class CancelState implements State { private Order order; public CancelState(Order order) { this.order = order; } @Override public void orderCreate() { System.out.println("乘客下单,订单新建中..."); // 改变状态(取消后可以开始新一轮叫单) Cancel -> New order.setState(order.getNewState()); } @Override
