状态模式:分离对象的状态到各个独立类中,以避免一个方法体包含过多的判断
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();
}
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();
}
相关文章推荐
- 判断一个对象的各个属性是否为空的方法
- js中判断一个对象的类型的种种方法
- php中判断一个字符串包含另一个字符串的方法
- C#利用反射来判断对象是否包含某个属性的实现方法
- 写一个递归方法,传入一个Map,返回这个Map对象中一共有多个Map类型的对象 Map中是可以添加Map,被添加的这个Map也可以添加Map,所以需要判断传入的Map对象的所有子节点,如果是Map就
- 编写js扩展方法判断一个数组中是否包含某个元素
- C#利用反射来判断对象是否包含某个属性的实现方法
- JavaScript判断一个字符串是否包含指定子字符串的方法
- 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?
- js判断一个字符串是否包含一个子串的方法
- php中判断一个字符串包含另一个字符串的方法
- Python判断一个字符串是否包含子串的几种方法
- C#利用反射来判断对象是否包含某个属性的实现方法
- python使用any判断一个对象是否为空的方法
- 请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
- (开发篇) null判断~ .net判断一个对象是否为空的方法(未完待续)
- Map.containsKey方法——判断Map集合对象中是否包含指定的键名
- iOS 自己项目中的一些总结(tableview 避免重用以及多选状态下判断数组中的bool值是不是同一个状态以及自定义控件的原因)
- javascript 判断一个对象为数组的方法
- 判断一个对象是否为jquery对象的方法