问题描述
假如我们要描述员工一天的工作状态,使用状态模式来实现。
代码实现
State类
public abstract class State
{
public abstract void WriteProgram(Work work);
}
具体状态类
public class ForenoonState : State
{
public override void WriteProgram(Work work)
{
if (work.Hour < 13)
Console.WriteLine($"当前时间:{work.Hour} 点,饿了,午饭;困了,午休");
else
{
work.SetState(new AfternoonState());
work.WriteProgram();
}
}
}
public class AfternoonState : State
{
public override void WriteProgram(Work work)
{
if (work.Hour < 17)
Console.WriteLine($"当前时间:{work.Hour} 点, 下午状态不错,继续努力");
else
{
work.SetState(new EveningState());
work.WriteProgram();
}
}
}
public class EveningState : State
{
public override void WriteProgram(Work work)
{
if (work.GetFinished())
work.SetState(new RestState());
else
{
if (work.Hour < 21)
Console.WriteLine($"当前时间:{work.Hour} 点,加班哦,疲累之极");
else
{
work.SetState(new SleepingState());
work.WriteProgram();
}
}
}
}
public class RestState : State
{
public override void WriteProgram(Work work)
{
Console.WriteLine($"当前时间:{work.Hour} 点,下班回家了");
}
}
public class SleepingState : State
{
public override void WriteProgram(Work work)
{
Console.WriteLine($"当前时间: {work.Hour} 点,睡觉了");
}
}
上下文类
public class Work
{
private State mCurState;
public Work()
{
mCurState = new ForenoonState();
}
public int Hour { get; set; }
private bool mFinished = false;
public bool GetFinished()
{
return mFinished;
}
public void SetFinished(bool finished)
{
mFinished = finished;
}
public void SetState(State state)
{
mCurState = state;
}
public void WriteProgram()
{
mCurState.WriteProgram(this);
}
}
Main方法:
internal class Program
{
static void Main(string[] args)
{
Work work = new Work();
work.Hour = 9;
work.WriteProgram();
work.Hour = 10;
work.WriteProgram();
work.Hour = 12;
work.WriteProgram();
work.Hour = 13;
work.WriteProgram();
work.Hour = 14;
work.WriteProgram();
work.Hour = 17;
work.WriteProgram();
work.SetFinished(false);
work.WriteProgram();
work.Hour = 19;
work.WriteProgram();
work.Hour = 22;
work.WriteProgram();
}
}
执行结果:
当前时间:9 点,饿了,午饭;困了,午休
当前时间:10 点,饿了,午饭;困了,午休
当前时间:12 点,饿了,午饭;困了,午休
当前时间:13 点, 下午状态不错,继续努力
当前时间:14 点, 下午状态不错,继续努力
当前时间:18 点,加班哦,疲累之极
当前时间:18 点,加班哦,疲累之极
当前时间:19 点,加班哦,疲累之极
当前时间: 22 点,睡觉了
UML图