状态模式就是一个对象的状态改变时,它的行为也会改变
使用情况:
(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(); } } } 我们开始受理,开始备货 用户取消订单
货物不喜欢,取消订单 我们开始受理,开始备货 备货完成,我们开始发货 检查货物,没问题就签收了 收获成功