以订单状态为例【待支付、取消、待发货、待收货、已结束】
- UML图:
- 代码实现:
public abstract class BaseState
{
/// <summary>
/// 订单状态
/// </summary>
public OrderStateEnum CurrentState { get; set; }
/// <summary>
/// 获取下一个状态
/// </summary>
/// <returns></returns>
public abstract void GetNextState(OrderContext context);
/// <summary>
/// 显示当前的状态
/// </summary>
public virtual void Show()
{
Console.WriteLine($"当前状态为:{CurrentState.ToString()}");
}
}
public class WaitPayState : BaseState
{
/// <summary>
/// 是否支付完成
/// </summary>
public bool IsPayOff { get; set; }
/// <summary>
/// 初始化
/// </summary>
/// <param name="payOff">是否支付完成</param>
public WaitPayState(bool payOff)
{
base.CurrentState = OrderStateEnum.待支付;
this.IsPayOff = payOff;
}
public override void GetNextState(OrderContext context)
{
if (IsPayOff)
{
context.OrderState = new WaitSendState();
}
else
{
context.OrderState = new CancelState();
}
}
/// <summary>
/// 显示当前的状态和支付情况
/// </summary>
public override void Show()
{
Console.WriteLine($"当前状态为:{CurrentState.ToString()},是否支付完成:{IsPayOff}");
}
}
public class CancelState : BaseState
{
public CancelState()
{
base.CurrentState = OrderStateEnum.取消;
}
public override void GetNextState(OrderContext context)
{
context.OrderState = new OverState();
}
}
public class WaitSendState : BaseState
{
public WaitSendState()
{
base.CurrentState = OrderStateEnum.待发货;
}
public override void GetNextState(OrderContext context)
{
context.OrderState = new WaitGetState();
}
}
public class WaitGetState : BaseState
{
public WaitGetState()
{
base.CurrentState = OrderStateEnum.待收货;
}
public override void GetNextState(OrderContext context)
{
context.OrderState = new OverState();
}
}
public class OverState : BaseState
{
public OverState()
{
base.CurrentState = OrderStateEnum.已结束;
}
public override void GetNextState(OrderContext context)
{
Console.WriteLine("订单已经结束了");
}
}
public class OrderContext
{
public BaseState OrderState { get; set; }
public void GetNextState()
{
OrderState.GetNextState(this);
}
/// <summary>
/// 显示当前的状态
/// </summary>
public void Show()
{
OrderState.Show();
}
}
/// <summary>
/// 订单枚举
/// </summary>
public enum OrderStateEnum
{
[Description("待支付")]
待支付 = 0,
[Description("取消")]
取消 = 1,
[Description("待发货")]
待发货 = 2,
[Description("待收货")]
待收货 = 3,
[Description("已结束")]
已结束 = 4,
}
- 调用端代码:
class Program
{
static void Main(string[] args)
{
{
Console.WriteLine("************************支付完成***********************");
BaseState orderState = new WaitPayState(true);
var context = new OrderContext
{
OrderState = orderState
};
context.Show();
context.GetNextState();
context.Show();
context.GetNextState();
context.Show();
context.GetNextState();
context.Show();
context.GetNextState();
}
{
Console.WriteLine("************************支付未完成***********************");
BaseState orderState = new WaitPayState(false);
var context = new OrderContext
{
OrderState = orderState
};
context.Show();
context.GetNextState();
context.Show();
context.GetNextState();
context.Show();
context.GetNextState();
}
Console.ReadLine();
}
}
- 运行效果:
- 总结
状态模式,主要解决的是当控制一个对象状态转化的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,就没有必要使用状态模式了。
代码下载地址:https://pan.baidu.com/s/1jjfl6V8WUxNaZgS-5BPnNQ 7xjq