状态模式就是一个对象的状态改变时,它的行为也会改变
使用情况:
(1)、对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
(2)、代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态
比如:1个订单,用户下单,商家受理,商家发货,确认收货,收货成功这几个状态,当然用户也可以选择取消订单(不签收)的状态
通过实现同一个State接口来交互来达到解耦
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 状态模式
{
public sealed class Order
{
private State currentState;
public bool IsCancel { get; set; }
public Order()
{
currentState = new WaintForAccept();
IsCancel = false;
}
private double minute;
public double Minute
{
get { return minute; }
set { minute = value; }
}
private bool finish;
public bool Finish
{
get { return finish; }
set { finish = value; }
}
public void SetState(State s)
{
currentState = s;
}
public void Action()
{
currentState.Process(this);
}
}
public interface State
{
void Process(Order order);
}
//等待受理状态-具体状态角色
public sealed class WaintForAccept : State
{
public void Process(Order order)
{
Console.WriteLine("我们开始受理,开始备货");
//接受半个小时之内可以取消订单
if (order.Minute < 30 && order.IsCancel)
{
Console.WriteLine("用户取消订单");
order.SetState(new CancelOrder());
order.Action();
return;
}
order.SetState(new AcceptAndDeliver());
order.Finish = false;
order.Action();
}
}
//受理发货
public sealed class AcceptAndDeliver : State
{
public void Process(Order order)
{
Console.WriteLine("备货完成,我们开始发货");
if (order.Minute < 30 && order.IsCancel)
{
Console.WriteLine("用户取消订单");
order.SetState(new CancelOrder());
order.Action();
return;
}
if(order.Finish==false)
{
order.SetState(new ConfirmReceipt());
order.Action();
}
}
}
//确认收货
public sealed class ConfirmReceipt : State
{
public void Process(Order order)
{
Console.WriteLine("检查货物,没问题就签收了");
order.SetState(new Success());
order.Action();
}
}
//收货成功
public sealed class Success : State
{
public void Process(Order order)
{
Console.WriteLine("收获成功");
order.Finish = true;
}
}
//取消订单
public sealed class CancelOrder : State
{
public void Process(Order order)
{
Console.WriteLine("货物不喜欢,取消订单");
order.Finish = false;
}
}
class Program
{
static void Main(string[] args)
{
Order order = new Order();
order.IsCancel = true;
order.Minute = 20;
order.Action();
Order order1 = new Order();
order1.IsCancel = false;
order1.Minute = 33;
order1.Action();
Console.ReadKey();
}
}
}
我们开始受理,开始备货
用户取消订单
货物不喜欢,取消订单
我们开始受理,开始备货
备货完成,我们开始发货
检查货物,没问题就签收了
收获成功