1.状态类
namespace StatePattern
{
/*状态模式:一个方法的判断逻辑太长,就不容易修改。方法过长,其本质就是,
* 就是本类在不同条件下的状态转移。状态模式,就是将这些判断分开到各个能
* 表示当前状态的独立类中*/
/// <summary>
/// 控制状态转移
/// </summary>
public abstract class State
{
public abstract void ControlState(Eat eat);
}
/// <summary>
/// 早饭
/// </summary>
public class Breakfast : State
{
public override void ControlState(Eat eat)
{
if (eat.current == 8)
Console.WriteLine("吃早饭");
else
{
eat.SetState(new Lunch());
eat.Dine();
}
}
}
/// <summary>
/// 午饭
/// </summary>
public class Lunch : State
{
public override void ControlState(Eat eat)
{
if (eat.current == 12)
Console.WriteLine("吃午饭");
else
{
if (eat.current == 16)
{
eat.SetState(new AfternoonTea());
eat.Dine();
}
else
{
eat.SetState(new Dinner());
eat.Dine();
}
}
}
}
/// <summary>
/// 晚饭
/// </summary>
public class Dinner : State
{
public override void ControlState(Eat eat)
{
if (eat.current == 18)
Console.WriteLine("吃晚饭");
}
}
/// <summary>
/// 下午茶
/// </summary>
public class AfternoonTea : State
{
public override void ControlState(Eat eat)
{
if (eat.current == 16)
Console.WriteLine("吃晚饭");
}
}
/// <summary>
///
/// </summary>
public class Eat
{
State state;
public int current;//当前时间,以用来控制状态转移
public Eat()
{
state = new Breakfast();//初始状态
}
/// <summary>
/// 根据条件,设置新状态
/// </summary>
/// <param name="stateObj"></param>
public void SetState(State stateObj)
{
state = stateObj;
}
/// <summary>
/// 当状态改变后,转移到相关状态去
/// </summary>
public void Dine()
{
state.ControlState(this);
}
}
}
2.调用
static void Main(string[] args)
{
Eat eat = new Eat();
eat.current = 16;
eat.Dine();
}