状态模式:
GOF给出的解释是:让一个对象得行为随着内部状态的变化而变化,而该对象也像换了个类似的。
例子:
1.魔兽世界中,有一种德鲁伊的职业,他本身有好几种状态,每一种状态都可以互相切换。而不同的状态下,他的技能又不一样。玩家通过释放技能改变它本身的状态,在状态改变之后,它就想脱胎换骨一样,不仅技能变了,长相也变了。
2.qq好友有上线、离线、忙碌、等待消息等几种状态,不同状态下对好友的回复也是不一样的。
3.TCP连接有几种状态。已连接、等待连接、断开连接等。
代码:
public abstract class State
{
protected Context context;
public State(Context context)
{
this.context = context;
}
public abstract void HandleState(int index);
}
public class StateA : State
{
public StateA(Context context) : base(context) { }
public override void HandleState(int index)
{
if(index > 10 && index < 20)
{
this.context.SetState(new StateB(this.context));
Console.WriteLine("由状态A切换到状态B");
}else
{
this.context.SetState(new StateC(this.context));
Console.WriteLine("由状态A切换到状态C");
}
}
}
public class StateB : State
{
public StateB(Context context) : base(context) { }
public override void HandleState(int index)
{
if(index < 10)
{
this.context.SetState(new StateA(this.context));
Console.WriteLine("由状态B切换到状态A");
}else if(index > 20)
{
this.context.SetState(new StateC(this.context));
Console.WriteLine("由状态B切换到状态C");
}
}
}
public class StateC : State
{
public StateC(Context context) : base(context) { }
public override void HandleState(int index)
{
if(index < 10)
{
this.context.SetState(new StateA(this.context));
Console.WriteLine("由状态C切换到状态A");
}
else if(index < 20)
{
this.context.SetState(new StateB(this.context));
Console.WriteLine("由状态C切换到状态B");
}
}
}
public class Context
{
private State m_state;
public void SetState(State state)
{
this.m_state = state;
}
public void Request(int index)
{
m_state.HandleState(index);
}
}
他其实就是一种组合关系和简单继承关系,Context类里面有状态的父类引用,刚开始在实例化Context的时候,给它set一个子类的状态,之后的状态变化就由状态的子类来操控了。Context只是一个请求者,真正的状态切换功能还是状态子类,因为状态的子类比Context更了解该切换到哪个状态。