设计模式系列-状态模式(二)
根据State的抽象实现了Context所需状态行为的实例,代码如下:
///
/// 执行该状态对应的行为,设置下一个状态实例
///
public class ConcereteStateA : State
{
public void Handle(Context context)
{
Console.WriteLine("状态A:处理行为执行了.....切换下一个状态B......");
context.CurrentState = new ConcereteStateB();
}
}
///
/// 执行该状态对应的行为,设置下一个状态实例
///
public class ConcereteStateB : State
{
public void Handle(Context context)
{
Console.WriteLine("状态B:处理行为执行了.....切换下一个状态A......");
context.CurrentState = new ConcereteStateA();
}
}
主函数调用如下:
Context context = new Context(new ConcereteStateA());
context.Request();
context.Request();
输出结果如下:
状态A:处理行为执行了.....切换下一个状态B......
状态B:处理行为执行了.....切换下一个状态A......
4、状态模式的优点
将特定状态的行为分开来,因为状态模式将所有状态的行为都放入到具体对象中,通过实现状态的抽象(接口State),可以很容易增加新的状态。
三、故宫游的状态模式实现
首先呢,我在参观(Visit)的时候,会参观不同的景点,体会每个景点时我内心状态都会发生变化,也就是说我每参观一个景点都会有一个对应的状态。此时每个景点就应该对应一个具体的状态实现。所以我在参观不同景点的时候当前状态实例也需要跟着切换,类图如下:
首先实现参观故宫类,每参观一个景点时都会改变我内心的状态,所以此时需要有一个属性代表当前状态,当体会该景点的时候就会执行对应的状态。代码如下:
///
/// 参观故宫类
///
public class IPVisitContext
{
public IPVisitContext() { }
public IPVisitContext(ISpotState state)
{
this.currentState = state;
}
///
/// 当前状态
///
private ISpotState currentState;
public ISpotState CurrentState
{
set
{
currentState = value;
}
}
///
/// 参观景点 执行对应状态
///
public void ExperienceSpot()
{
currentState.ExperienceSpot(this);
}
}
对于每个景点都会有不同的状态实例,此时需要一个状态的抽象,用户将来容易扩展新的状态实例,代码如下:
///
/// 参观景点状态的抽象
///
public interface ISpotState
{
void ExperienceSpot(IPVisitContext context);
}
接下来就是每个景点对应的状态实现了,代码如下:
///
/// 太和殿状态行为实例
///
public class 太和殿State : ISpotState
{
public void ExperienceSpot(IPVisitContext context)
{
Console.WriteLine("太和殿: 皇上的家的客厅真的宏伟气派啊,脑海中幻想着当时举行大型仪式的情景甚是激动!");
context.CurrentState = new 乾清宫State();
}
}
///
/// 乾清宫状态行为实例
///
public class 乾清宫State : ISpotState
{
public void ExperienceSpot(IPVisitContext context)
{
Console.WriteLine("乾清宫:是不是因为养心殿距离后宫很近雍正才搬过去的呀 ");
context.CurrentState = new 御花园State();
}
}
///
/// 御花园状态行为实例
///
public class 御花园State : ISpotState
{
public void ExperienceSpot(IPVisitContext context)
{
Console.WriteLine("御花园:御花园真的没有想象中的漂亮啊,很是失落.");
context.CurrentState = new 东六宫State();
}
}
///
/// 东六宫状态行为实例
///
public class 东六宫State : ISpotState
{
public void ExperienceSpot(IPVisitContext context)
{
Console.WriteLine("东六宫:已经看不出当年嫔妃们生活的环境了,成展馆了.");
context.CurrentState = new 九龙壁State();
}
}
///
/// 九龙壁状态行为实例
///
public class 九龙壁State : ISpotState
{
public void ExperienceSpot(IPVisitContext context)
{
Console.WriteLine("九龙壁:在宫中混,不会点三十六计都没脸见人.");
}
}
主函数调用如下:
IPVisitContext context = new IPVisitContext(new 太和殿State());//从太和殿开始参观