状态模式
概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
类的行为是基于它的状态改变的。
状态模式是状态机的一种实现方式即可。状态机又叫有限状态机,它有 3 个部分组成:状态、事件、动作。其中,事件也称为转移条件。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。
结构图

代码实现
状态
/// <summary> /// 抽象状态类 /// </summary> public abstract class State { public abstract void Handle(Context context); }
/// <summary> /// 具体状态A /// </summary> public class ConcreteStateA : State { public override void Handle(Context context) { context.State = new ConcreteStateB(); } }
/// <summary> /// 具体状态B /// </summary> public class ConcreteStateB : State { public override void Handle(Context context) { context.State = new ConcreteStateA(); } }
上下文
/// <summary> /// 上下文类,其中包含要维护的状态 /// </summary> public class Context { private State state; public Context(State state) { this.state = state; } public State State { get { return state; } set { state = value; Console.WriteLine("当前状态:" + state.GetType().Name); } } public void Request() { state.Handle(this); } }
客户端
class Program { static void Main(string[] args) { Context c = new Context(new ConcreteStateA()); c.Request(); c.Request(); c.Request(); c.Request(); Console.Read(); } }
运行结果

优势
封装了转换规则。
枚举可能的状态,在枚举状态之前需要确定状态种类。
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
使用场景
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
当控制一个对象状态的转换条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

浙公网安备 33010602011771号