码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2017-05-25 18:25:06      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:image   举例   adl   console   summary   man   修改   设计   oid   

状态模式

技术分享

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

环境类(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         }

 

结果如下:

技术分享

 

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

标签:image   举例   adl   console   summary   man   修改   设计   oid   

原文地址:http://www.cnblogs.com/zsx-blog/p/6905133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!