您的位置:首页 > 职场人生

极速理解设计模式系列:22.状态模式(State Pattern)

2011-12-19 12:02 676 查看
四个角色:抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client)

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

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

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

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

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

[b]类图:[/b]





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

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

下面我们在控制台程序去演示一下如何使用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 下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息