概述
状态模式也是一种行为型的设计模式,其最主要的思想是将状态封装到对象中,然后对象的行为依赖于状态,使用Switch语句是有不同的,较少了很多分支语句的使用,可以参考下面的例子,如果使用分支语句会有比较多的判断,但是使用状态模式,就减少了对应的判断,也使得代码在使用的时候会减少出错,因为使用的时候只有切换,不用传具体的状态,不过这个模式的缺点也一眼就可以看出,代码控制性不如分支语句。其主要组成部分是状态接口,具体的状态,状态控制器,用状态控制器控制状态的切换。举例如下
例子:现在有个游戏BOOS的状态有,普通,生气,狂暴三个状态,使用一个状态控制器调用一个方法控BOSS的状态切换。
状态模式
using System.Numerics;
internal class Program
{
private static void Main(string[] args)
{
StateControl SC = new StateControl(new CommonState());
SC.Switch(); //切换到普通状态
SC.Switch(); //切换到生气状态
SC.Switch(); //切换到狂暴状态
}
public interface IState//状态接口
{
void SwitchingStatus(StateControl sc);
}
public class CommonState : IState//普通状态
{
public void SwitchingStatus(StateControl sc)
{
Console.WriteLine("BOOS进入普通状态!");
sc.SetState(new AngryState());
}
}
public class AngryState : IState//生气状态
{
public void SwitchingStatus(StateControl sc)
{
Console.WriteLine("BOOS进入生气状态!");
sc.SetState(new MusthState());
}
}
public class MusthState : IState//狂暴状态
{
public void SwitchingStatus(StateControl sc)
{
Console.WriteLine("BOOS进入狂暴状态!");
}
}
public class StateControl//状态控制器
{
private IState _state;
public StateControl(IState state)
{
_state = state;
}
public void SetState(IState state)
{
_state = state;
}
public void Switch()
{
_state.SwitchingStatus(this);
}
}
}
运行结果:
BOOS进入普通状态!
BOOS进入生气状态!
BOOS进入狂暴状态!