状态模式
状态模式是策略模式的孪生兄弟,状态模式强调对象内部状态的变化改变对象的行为,策略模式重在外部对策略的选择,策略的选择由外部条件决定。
环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState): 每一子类实现一个与Context的一个状态相关的行为。
我们以公司的申请审批流程的场景来举例,首先是员工提出一个申请,然后流转到主管,经理,总监。
先定义一个抽象状态类(State)接口
1 public interface IState 2 { 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 : IState 17 { 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 : IState 30 { 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 : IState 43 { 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 }
结果如下:
时间: 2024-11-05 22:58:11