四个角色:抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client)
抽象状态类(State):提供一个与情景类有关的State行为。
具体状态类(ConcreateState):实现这个行为,实现一个状态。
情景类(Context):维护一个State的实例对象,并且提供一个客户操作置换状态的接口。
客户端(Client):直接调用情景类操作即可。
实现思路:直接调用情景类,然后在情景类自动操作或者手动操作置换状态,并且取得不同结果。
类图:
应用场景:文件提交审核入库。
分析:文件创建,然后提交审核,审核通过再入库,入库保存完成进入下一流程。
下面我们在控制台程序去演示一下如何使用State Pattern:
一、抽象状态类(State)
- //抽象状态类(State)
- public abstract class State
- {
- public abstract void Submit(FileSub filesub);
- }
二、具体状态类(ConcreateState)
- //具体状态类(ConcreateState)
- public class BeginState : State
- {
- public override void Submit(FileSub filesub)
- {
- Console.WriteLine("创建文档,提交待审核。");
- filesub.SetState(new CheckState());
- }
- }
- //具体状态类(ConcreateState)
- public class CheckState : State
- {
- public override void Submit(FileSub filesub)
- {
- Console.WriteLine("审核文档,准备入库");
- filesub.SetState(new StorageState());
- }
- }
- //具体状态类(ConcreateState)
- public class StorageState : State
- {
- public override void Submit(FileSub filesub)
- {
- Console.WriteLine("入库完成,准备结束此流程");
- filesub.SetState(new CompleteState());
- }
- }
- //具体状态类(ConcreateState)
- public class CompleteState : State
- {
- public override void Submit(FileSub filesub)
- {
- Console.WriteLine("结束此流程,准备创建下一个文件");
- filesub.SetState(new BeginState());
- }
- }
三、情景类(Context)
- //情景类(Context)
- public class FileSub
- {
- private State state;
- public FileSub()
- {
- state = new BeginState();
- }
- public void SetState(State stateOne)
- {
- state = stateOne;
- }
- public void Submit()
- {
- state.Submit(this);
- }
- }
四、客户端(Client)
- //客户端(Client)
- class Program
- {
- static void Main(string[] args)
- {
- FileSub file = new FileSub();
- file.Submit();
- file.Submit();
- file.Submit();
- file.Submit();
- Console.ReadLine();
- }
- }
如需源码请点击 StatePattern.rar 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827090