首页 > 代码库 > C# 设计模式下的状态模式

C# 设计模式下的状态模式

状态模式

技术分享

状态模式是策略模式的孪生兄弟,状态模式强调对象内部状态的变化改变对象的行为,策略模式重在外部对策略的选择,策略的选择由外部条件决定。

环境类(Context):  定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。

抽象状态类(State):  定义一个接口以封装与Context的一个特定状态相关的行为。

具体状态类(ConcreteState):  每一子类实现一个与Context的一个状态相关的行为。

 

我们以公司的申请审批流程的场景来举例,首先是员工提出一个申请,然后流转到主管,经理,总监。

先定义一个抽象状态类(State)接口

1     public interface IState2     {3         /// <summary>4         /// 申请5         /// </summary>6         /// <param name="vac"></param>7         void Submit(VacationApply vac);8     }

 

定义环境类(Context)

 1     public class StaffApply 2     { 3         public IState CurrentApplyState; 4  5         public StaffApply(IState vs) 6         { 7             this.CurrentApplyState = vs; 8         } 9 10         public void Submit()11         {12             CurrentApplyState.Submit(this);13         }14     }

 

定义具体状态类(ConcreteState)

 1     /// <summary> 2     /// 员工 3     /// </summary> 4     public class StaffState : IState 5     { 6         public void Submit(StaffApply vac) 7         { 8             Console.WriteLine("当前流程已到员工..."); 9             vac.CurrentApplyState = new SupervisorState();10         }11     }12 13     /// <summary>14     /// 主管15     /// </summary>16     public class SupervisorState : IState17     {18 19         public void Submit(StaffApply vac)20         {21             Console.WriteLine("当前流程已到主管...");22             vac.CurrentApplyState = new ManagerState();23         }24     }25 26     /// <summary>27     /// 经理28     /// </summary>29     public class ManagerState : IState30     {31         public void Submit(StaffApply vac)32         {33             Console.WriteLine("当前流程已到经理...");34             vac.CurrentApplyState = new DirectorState();35         }36 37     }38 39     /// <summary>40     /// 总监41     /// </summary>42     public class DirectorState : IState43     {44         public void Submit(StaffApply vac)45         {46             Console.WriteLine("当前流程已到总监...");47             vac.CurrentApplyState = new DirectorState();48         }49     }

 可以看到当前具体状态类的下一步状态是由类本身决定的。对外是透明的。以主管的申请提交来看。

vac.CurrentApplyState = new ManagerState();

主管的下一步状态已经决定了他下一步的状态是到经理。这一步可以按照业务逻辑进行修改

最后的客户端代码如下

 1         static void Main(string[] args) 2         { 3             //开始员工申请 4             StaffApply voc = new StaffApply(new StaffState()); 5             //提交下一步 6             voc.Submit(); 7             Console.ReadLine(); 8             //提交下一步 9             voc.Submit();10             Console.ReadLine();11             //提交下一步12             voc.Submit();13             Console.ReadLine();14             //提交下一步15             voc.Submit();16             Console.ReadLine();17         }

 

结果如下:

技术分享

 

C# 设计模式下的状态模式