极速理解设计模式系列:22.状态模式(State Pattern)
四个角色:抽象状态类(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 下载。