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

状态模式

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

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

C# 设计模式下的状态模式的相关文章

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

【游戏设计模式】之三 状态模式、有限状态机 &amp; Unity版本实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if else加标志位的方式并不能很地道地解决状态复杂变换的问题,这时,就可以运用到状态模式以及状态机来高效地完成任务.状态模式与状态机,因为他们关联紧密,常

《Java设计模式》之状态模式

状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 定义与结构 GOF<设计模式>中给状态模式下的定义为:允许一个对象在其内部状态改变时改变它的行为.这个对象看起来似乎修改了它的类.看起来,状态模式好像是神通广大--居然能够"修改自身的类"! 能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这

设计模式笔记:状态模式&amp;策略模式

这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻

调侃《First head 设计模式》之状态模式篇

现在有个糖果控制器,它的运行状态图如下: 我们要用java来实现这个糖果控制器.首先需要用一些实例变量来表示不同的状态: 我们的思路是创建一个糖果控制器类,它就像一个状态机,每个可能的操作都创建一个方法,在这些方法内部对当前状态进行判断,并做出相应的反应. 由于这并不难理解,所以直接上代码(有点长): 看起来这个系统是十分精密,无懈可击了.但是.. 需求有改变,糖果机要再曲柄转动后有10%可能性进入到赢家状态,这时候可以得到两颗糖果. 这下你有的忙了,你先要增加表示状态的实例变量,这还不算,还要

Java设计模式学习记录-状态模式

前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使用时无需关心对象的状态,可以实现自身的一致性处理.最近工作有些忙,更新博客慢了.还是要严格要求自己的,抽时间也要坚持学习. 状态模式 概念介绍 状态模式允许一个对象在其状态改变时,改变它的行为,对象看起来似乎修改了它的类. 想要在改变自身状态时改变对象行为,最直接的方法就是在代码中将所有可能发生的情

设计模式--22、状态模式

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

Java设计模式系列之状态模式

状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式(State)适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. 这个状态通常用一个或多个枚举常量表示. 通常,有多个操作包含这一相同的条件结构. State模式将每一个条件分支

设计模式7(状态模式,备忘录模式)

状态模式 上下文对象通过改变状态来改变行为,看起来就像是改变了类型 分离状态,选择行为 状态模式 各种状态不能替换 上下文对象中维护的状态对象 分离状态,选择行为 策略模式 各种策略可以互相替换     观察者模式     行为是固定的,就是通知观察者,以达到触发联动的效果 单例模式 如有需要可以将状态设置为单例                     备忘录模式 在不破坏原发器封装的前提下,捕获其内部状态(备忘录),并在对象外部由"备忘录管理者"保存管理, 以便在操作后,恢复状态 保