状态模式:当一个对象的内在状态改变时运行改变其行为,这个对象看起来像是改变了其类。
状态模式结构
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
适用性
1,一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为.
2,一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常,有多个操作包含这一相同的条件结构.State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
模式的好处
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
示例
灯泡有两种状态:亮和不亮,我们通过它的开关来切换它的状态。
本例中状态只有两个,不能概括那种状态转换过于复杂的情况,但本例主要是用来表示状态模式的。
namespace 电灯的状态
{
//抽象状态类
abstract class LightState
{
public abstract void PressSwitch(Light light); //按下按钮
}
//电灯打开状态类
class LightOn : LightState
{
public override void PressSwitch(Light light)
{
light.State = new LightOff();
Console.WriteLine("电灯已关");
}
}
//电灯关闭状态类
class LightOff : LightState
{
public override void PressSwitch(Light light)
{
light.State = new LightOn();
Console.WriteLine("电灯已开");
}
}
//电灯类
class Light
{
private LightState state;
public LightState State
{
get { return state; }
set { state = value; }
}
public Light(LightState state) //构造时设置初始状态
{
this.state = state;
}
public void PressLightSwitch()
{
state.PressSwitch(this); //转换本类的状态
}
}
class Program
{
static void Main(string[] args)
{
Light light = new Light(new LightOn()); //打开状态
//反复开关。。。
light.PressLightSwitch();
light.PressLightSwitch();
light.PressLightSwitch();
light.PressLightSwitch();
light.PressLightSwitch();
}
}