您的位置:首页 > 其它

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

2012-01-12 20:45 489 查看
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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐