极速理解设计模式系列: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 下载。

posted @ 2011-12-19 12:02  .NET架构  阅读(4564)  评论(1编辑  收藏  举报