定义
将对象的状态抽象成类,通过对象状态的改变来改变对象自身的行为状态。核心在于将状态抽象,状态的转换改变对象的状态行为。
下面举个很简单的例子:通过状态模式对订单进行控制,假设订单有这样的一个流程机制:新增----审核---提交----结束,相邻状态之间可以相互转换。
类图
代码
public class OrderInfo { public OrderState orderState = new NewState(); ///默认新增状态 public OrderInfo(OrderState state) { orderState = state; } public void SetPreview() { if (orderState != null) { orderState.SetPreviewState(this); } } public void SetNext() { if (orderState != null) { orderState.SetNextState(this); } } } public abstract class OrderState { public abstract void SetPreviewState(OrderInfo orderInfo); public abstract void SetNextState(OrderInfo orderInfo); } public class NewState : OrderState { public override void SetNextState(OrderInfo orderInfo) { Console.WriteLine("审核成功"); orderInfo.orderState = new CheckState(); } public override void SetPreviewState(OrderInfo orderInfo) { ///没有上一个状态了 } } public class CheckState : OrderState { public override void SetNextState(OrderInfo orderInfo) { Console.WriteLine("审核成功"); orderInfo.orderState = new NewState(); } public override void SetPreviewState(OrderInfo orderInfo) { Console.WriteLine("取消审核成功"); orderInfo.orderState = new NewState(); } } public class SummitState : OrderState { public override void SetNextState(OrderInfo orderInfo) { Console.WriteLine("订单完成"); orderInfo.orderState = new CheckState(); } public override void SetPreviewState(OrderInfo orderInfo) { Console.WriteLine("回退订单成功"); orderInfo.orderState = new CheckState(); } } public class FinishState : OrderState { public override void SetNextState(OrderInfo orderInfo) { Console.WriteLine("订单已经结束"); } public override void SetPreviewState(OrderInfo orderInfo) { } }
总结
代码还是非常简单,当然订单当中还可以加入很多逻辑处理。状态模式侧重在于状态,在于对象状态的改变来控制对象的行为。而不是面向过程式的通过对象自身来控制状态,如果以这种形式,将会出现比较多的判断。