状态模式的定义
代码实现
public enum LightColor
{
Green = 0,
Yellow = 1,
Red = 2,
Blue = 3
}
public abstract class LightBase
{
public LightColor Color { get; set; }
public void Shine()
{
Console.WriteLine("灯亮着");
}
public abstract void Show();
public abstract void TurnContext(Context context);
}
public class LightRed : LightBase
{
public LightRed()
{
base.Color = LightColor.Red;
}
public override void Show()
{
Console.WriteLine("红灯停");
}
public override void TurnContext(Context context)
{
context.CurrentLight = new LightBlue();
}
}
public class LightGreen : LightBase
{
public LightGreen()
{
base.Color = LightColor.Green;
}
public override void Show()
{
Console.WriteLine("绿灯行");
}
public override void TurnContext(Context context)
{
context.CurrentLight = new LightYellow();
}
}
public class LightYellow : LightBase
{
public LightYellow()
{
base.Color = LightColor.Yellow;
}
public override void Show()
{
Console.WriteLine("黄灯请小心");
}
public override void TurnContext(Context context)
{
context.CurrentLight = new LightRed();
}
}
行为型模式的第三者:Context
public class Context
{
public LightBase CurrentLight { get; set; }
public void Show()
{
this.CurrentLight.Show();
}
public void Turn()
{
this.CurrentLight.TurnContext(this);
}
}
调用方代码,操作第三者Context:
LightBase light = new LightGreen();
Context context = new Context()
{
CurrentLight = light
};
context.Show();
context.Turn();
context.Show();
context.Turn();
context.Show();
context.Turn();
context.Show();
context.Turn();
要点总结
状态模式效果:
1、状态模式的本质是将条件语句的各个分支封装起来,从而实现了状态逻辑与动作的分离。当分支很多时,状态模式可以给代码的维护带来很大的便利。 2、多态性的实现。 3、状态转换的显示化。状态模式将状态的切换逻辑存放到状态对象中,可以实现状态的自动切换,使各个状态界限分明,相互独立。 4、采用分支结构时,Context对象需要关心所有状态的切换逻辑,当分支越来越多时,复杂度也会越来越大。而状态模式中Context无需关心状态的切换逻辑,每个状态对象也只需关心状态的下一个可能状态的切换逻辑。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式的目的是为了将状态与不同状态下的行为进行分离,从而简化复杂的条件判断。
状态模式主要适用场景:
|