首页 > 代码库 > 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# 设计模式下的状态模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。