我不知道我的这个标题是否合适.反正不管了.我只是希望用轻松的写法把设计模式表示清楚.(当然也许不清楚)反正我就怎么写了.OK,现在好了.如果在旅行中一个旅者有很多种状态.这些状态会直接影响到他的行为.例如.饿了就去吃饭.渴了就要喝水.累了就要休息.正常状态就要继续旅行.并且这些状态相互切换.那么你会怎么做?如果是我.我首先会想到使用开关.那要直观简单.Ok那我们就那么做
enum myState {HUNGRY ,ADRY,TIRE,OK};
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这样的情况开关语句显得很繁琐.也许你会说写函数,可是那一的情况是不够通用.并且不符合面向对象原则.是的接下来我们依然要做的是把开关踢掉.因为我们有理由相信我们有更好的办法来解决问题.
由以上我们可以看出.状态由一个状态管理者和状态本身来决定其行为.因此.要考虑的是如何让管理者能管理更多的状态.也就是说状态必须被抽象出来.换句话说也就是要使用接口或抽象类来解决问题.
interface ImyState{
void Execute(StateManager sm);
myState getState();
}
这就是一个抽象的状态.也就是其他具体的状态要派生至此.并且我们还必须要改写管理者对象.因为实际管理对象来完成开关所必须的指责.当然我们不用开关语句或if...else if.....而是用对象来出来具体情况.不相信就看着吧.....
public class Hungry_State : ImyState{
void Execute(StateManager sm){
//切换到下一个状态
sm.setState(new ADRY_State());
sm.Execute();
}
myState getState(){
retuen myState.HUNGRY;
}
}
public class ADRY_State : ImyState{
void Execute(StateManager sm){
//切换到下一个状态
sm.setState(new ADRY_State());
sm.Execute();
}
myState getState(){
retuen myState.ADRY;
}
}
public class TIRE_State : ImyState{
void Execute(StateManager sm){
//切换到下一个状态
sm.setState(new ADRY_State());
sm.Execute();
}
myState getState(){
retuen myState.TIRE;
}
}
public class OK_State : ImyState{
void Execute(StateManager sm){
//切换到下一个状态
sm.setState(new ADRY_State());
sm.Execute();
}
myState getState(){
retuen myState.OK;
}
}
public class StateManager{
private myState ms=null;
void setState(ImyState ims){
ms=ims;
}
void Execute(){
ms.Execute(this);
DoThing dt=new DoThing(this.ms.getState());
dt.Execute();
}
}
至此,管理者也重构完毕.这样我们就没有使用开关语句.而使用了更适合的面向对象原则.