using System;
namespace Pattern
{
/// <summary>
/// Summary description for Class1.
/// </summary>
/*public class StateManager
{
private myState state=null;
public void Execute()
{
//执行状态
DoThing dt=new DoThing(state);
dt.Execute();
//切换状态
swich(state)
{
case myState.HUNGRY:
state=myState.ADRY;
case myState.ADRY:
state=myState.TIRE;
case myState.TIRE:
state.=myState.OK;
case myState.OK:
state.=myState.HUNGRY;
}
}
}
public class DoThing
{
private myState state=null;
DoThing(myState svalue)
{
state=svalue;
}
public void Execute()
{
swich(this.state)
{
case myState.HUNGRY:
Console.Writeline("吃饭");
case myState.ADRY:
Console.Writeline("喝水");
case myState.TIRE:
Console.Writeline("休息");
case myState.OK:
Console.Writeline("继续旅行");
}
}
}
由以上可以看出.状态的变化直接影响到了.所要发生的事情.并且状态是在不断发生变化的.如果试想一下在复杂的情况下不是简单的赋值而是要做很多复杂的工作.例如POP邮箱TcpConection这样的情况开关语句显得很繁琐.也许你会说写函数,可是那一的情况是不够通用.并且不符合面向对象原则.是的接下来我们依然要做的是把开关踢掉.因为我们有理由相信我们有更好的办法来解决问题.
由以上我们可以看出.状态由一个状态管理者和状态本身来决定其行为.因此.要考虑的是如何让管理者能管理更多的状态.也就是说状态必须被抽象出来.换句话说也就是要使用接口或抽象类来解决问题.
*/
public enum myState {HUNGRY ,ADRY,TIRE,OK};
public interface ImyState
{
void Execute(StateManager sm);
myState getState();
}
public class Hungry_State : ImyState
{
public void Execute(StateManager sm)
{
//切换到下一个状态
sm.setState(new ADRY_State());
Console.WriteLine ("吃饭");
}
public myState getState()
{
return myState.HUNGRY;
}
}
public class ADRY_State : ImyState
{
public void Execute(StateManager sm)
{
//切换到下一个状态
sm.setState(new ADRY_State());
Console.WriteLine("喝水");
}
public myState getState()
{
return myState.ADRY;
}
}
public class TIRE_State : ImyState
{
public void Execute(StateManager sm)
{
//切换到下一个状态
sm.setState(new ADRY_State());
Console.WriteLine("休息");
}
public myState getState()
{
return myState.TIRE;
}
}
public class OK_State : ImyState
{
public void Execute(StateManager sm)
{
//切换到下一个状态
sm.setState(new ADRY_State());
Console.WriteLine("继续旅行");
}
public myState getState()
{
return myState.OK;
}
}
public class StateManager
{
private ImyState ms=null;
public void setState(ImyState ims)
{
ms=ims;
}
public void Execute()
{
ms.Execute(this);
}
}
}