状态模式
[ State ]
[ 行为模式 ]
当一个对象的内部状态改变时允许改变其行为 , 这个对象看起来像是改变了其类 。
将与特定状态相关的行为局部化 , 并且将不同状态的行为分割开来 。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
源码 :
interface IState
{
void WriteProgram(Work work);
}
class Work
{
private IState currentState;
public Work()
{
currentState = new ForenoonState();
}
// <summary>
// 时间
// </summary>
public double Hour { get; set; }
// <summary>
// 工作完成度
// </summary>
public bool TaskFinished { get; set; }
public void SetState(IState stats)
{
this.currentState = stats;
}
public void WriteProgram()
{
currentState.WriteProgram(this);
}
}
class ForenoonState : IState
{
public void WriteProgram(Work work)
{
if (work.Hour < 12)
{
Console.WriteLine("当前时间: {0}点 , 上午工作 , 精神百倍", work.Hour);
}
else
{
work.SetState(new NoonState());
work.WriteProgram();
}
}
}
class NoonState : IState
{
public void WriteProgram(Work work)
{
if (work.Hour < 13)
{
Console.WriteLine("当前时间: {0} 点 , 饿了 , 午饭;犯困,午休。", work.Hour);
}
else
{
work.SetState(new AfternoonState());
work.WriteProgram();
}
}
}
class AfternoonState : IState
{
public void WriteProgram(Work work)
{
if (work.Hour < 17)
{
Console.WriteLine("当前时间: {0}点 , 下午状态还行 , 继续努力", work.Hour);
}
else
{
work.SetState(new EveningState());
work.WriteProgram();
}
}
}
class EveningState : IState
{
public void WriteProgram(Work work)
{
if (work.TaskFinished)
{
work.SetState(new RestState());
work.WriteProgram();
}
else
{
if (work.Hour < 21)
{
Console.WriteLine("当前时间: {0} 点 , 加班哦 , 疲累之极", work.Hour);
}
else
{
work.SetState(new SleepingState());
work.WriteProgram();
}
}
}
}
class SleepingState : IState
{
public void WriteProgram(Work work)
{
Console.WriteLine("当前时间: {0}点不行了 ,睡着了",work.Hour);
}
}
class Program
{
static void Main(string[] args)
{
Work w = new Work();
w.Hour = 9;
w.WriteProgram();
w.Hour = 12.35;
w.WriteProgram();
w.Hour = 16.55;
w.WriteProgram();
w.TaskFinished = true;
w.Hour = 18.25;
w.WriteProgram();
Console.Read();
}
}