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