1、状态接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
/// <summary>
/// 状态设计模式 接口
/// </summary>
public interface IState
{
void handle();
}
}
2、具体状态1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
/// <summary>
/// 新建订单状态
/// </summary>
public class NewOrderState : IState
{
public void handle()
{
Console.WriteLine("新订单、未支付");
Console.WriteLine("调用商户客服服务,有新订单\n");
}
}
}
3、具体状态2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
/// <summary>
/// 已支付订单状态
/// </summary>
public class PayOrderState : IState
{
public void handle()
{
Console.WriteLine("新订单、已支付");
Console.WriteLine("通知商户客服服务,订单已经支付");
Console.WriteLine("调用物流服务、未发货\n");
}
}
}
4、具体状态3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
/// <summary>
/// 已经发货状态
/// </summary>
public class SendOrderState : IState
{
public void handle()
{
Console.WriteLine("订单已经发货");
Console.WriteLine("调用短信服务、告诉用户已经发货");
Console.WriteLine("更新物流信息\n");
}
}
}
5、订单上下文类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
/// <summary>
/// 订单上下文
/// </summary>
public class OrderContext
{
private IState state;
public OrderContext()
{
}
public OrderContext(IState state)
{
this.state = state;
}
// 设置状态 调用状态函数
public void SetState(IState state)
{
this.state = state;
Console.WriteLine("----订单状态变更----");
this.state.handle();
}
}
}
6、调用与使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StateModule
{
class Program
{
static void Main(string[] args)
{
// 创建订单
OrderContext orderContext = new OrderContext();
// 新建订单 状态
orderContext.SetState(new NewOrderState());
// 已经付款 状态
orderContext.SetState(new PayOrderState());
// 已经发货 状态
orderContext.SetState(new SendOrderState());
Console.ReadLine();
}
}
}
7、优点
1、改变对象状态 可以修改对象的行为
2、减少系统中的对象
8、缺点
1、增加系统的状态类
2、结构与实现较为复杂
3、对开闭原则的支持并不好