状态模式
状态模式(State Pattern),类的行为是基于它的状态改变的,状态模式主要解决的是当控制一个对象的条件表达式过于复杂的情况。把状态的判断逻辑装移到表示不同的一系列类当中,可以把复杂的判断逻辑简化。
- 状态模式的好处是将特定的状态相关的行为局部化,并且将不同状态的行为分割开来。将特定行为的状态相关都放入一个对象中,由于所有的状态相关的代码都存在于某个ConcretaState,所以通过定义新的子类可以很容易地增加新的状态和转换。通俗来讲,状态模式就是为了消除庞大的条件分支语句。
- 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
如下,以游戏常见的几种状态,开始、暂停、停止、重来几种状态为例,设计一个简单的状态模式类图
public class State
{
public virtual void DoAction(Game game)
{
throw new System.NotImplementedException();
}
}
public class StartState : State
{
public override void DoAction(Game game)
{
Console.WriteLine("Start Game!");
game.SetState(this);
}
}
public class PauseState : State
{
public override void DoAction(Game game)
{
Console.WriteLine("Pause Game!");
game.SetState(this);
}
}
...类似代码
public class Game
{
private State state;
public void SetState(State state)
{
this.state=state;
}
public State GetState()
{
return state;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Game game = new Game();
StartState start = new StartState();
start.DoAction(game);
PauseState pause = new PauseState();
pause.DoAction(game);
StopState stop = new StopState();
stop.DoAction(game);
}
}
输出结果:
Start Game!
Pause Game!
Stop Game!
从以上示例可以看出,使用状态模式虽然可以很方便的进行状态切换,但是也会新增很多状态类,一般简单的状态切换还是可以考虑常规的方法,针对一些大型系统,比较复杂的状态切换的类我们才考虑采用状态模式来设计,方便后期的扩展维护。例如在游戏开发中角色会分为行走、跑步、攻击、死亡以及胜利等各种状态,设计时就可以采用状态模式来设计角色的行为,让后后期更易于维护