四个角色:抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client) 

        抽象状态类(State):提供一个与情景类有关的State行为。

        具体状态类(ConcreateState):实现这个行为,实现一个状态。

        情景类(Context):维护一个State的实例对象,并且提供一个客户操作置换状态的接口。

        客户端(Client):直接调用情景类操作即可。

实现思路:直接调用情景类,然后在情景类自动操作或者手动操作置换状态,并且取得不同结果。

类图: 

 

应用场景:文件提交审核入库。

分析:文件创建,然后提交审核,审核通过再入库,入库保存完成进入下一流程。

        下面我们在控制台程序去演示一下如何使用State Pattern:

        一、抽象状态类(State)

 

  1. //抽象状态类(State) 
  2. public abstract class State 
  3.     public abstract void Submit(FileSub filesub);        

        二、具体状态类(ConcreateState)

 

  1. //具体状态类(ConcreateState) 
  2. public class BeginState : State 
  3.     public override void Submit(FileSub filesub) 
  4.     { 
  5.         Console.WriteLine("创建文档,提交待审核。"); 
  6.         filesub.SetState(new CheckState()); 
  7.     } 
  8.  
  9. //具体状态类(ConcreateState) 
  10. public class CheckState : State 
  11.     public override void Submit(FileSub filesub) 
  12.     { 
  13.         Console.WriteLine("审核文档,准备入库"); 
  14.         filesub.SetState(new StorageState()); 
  15.     } 
  16.  
  17. //具体状态类(ConcreateState) 
  18. public class StorageState : State 
  19.     public override void Submit(FileSub filesub) 
  20.     { 
  21.         Console.WriteLine("入库完成,准备结束此流程"); 
  22.         filesub.SetState(new CompleteState()); 
  23.     } 
  24.  
  25. //具体状态类(ConcreateState) 
  26. public class CompleteState : State 
  27.     public override void Submit(FileSub filesub) 
  28.     { 
  29.         Console.WriteLine("结束此流程,准备创建下一个文件"); 
  30.         filesub.SetState(new BeginState()); 
  31.     } 

        三、情景类(Context)

 

  1. //情景类(Context) 
  2. public class FileSub 
  3.     private State state; 
  4.     public FileSub() 
  5.     { 
  6.         state = new BeginState(); 
  7.     } 
  8.     public void SetState(State stateOne) 
  9.     { 
  10.         state = stateOne; 
  11.     } 
  12.     public void Submit() 
  13.     { 
  14.         state.Submit(this); 
  15.     } 

        四、客户端(Client)

 

  1. //客户端(Client) 
  2. class Program 
  3.     static void Main(string[] args) 
  4.     { 
  5.         FileSub file = new FileSub(); 
  6.         file.Submit(); 
  7.         file.Submit(); 
  8.         file.Submit(); 
  9.         file.Submit(); 
  10.         Console.ReadLine(); 
  11.     } 

       如需源码请点击 StatePattern.rar 下载。