状态模式:分离对象的状态到各个独立类中,以避免一个方法体包含过多的判断

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 03:22   156   0

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();

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP