状态模式
状态模式,当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
面向对象设计其实就是希望做到代码的责任分解。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式的好处
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。
这样做的目的就是为了消除庞大的条件分支语句,状态模式通过把各种状态转移逻辑分布到State的子类之间,来较少相互间的依赖。
使用状态模式的时机
当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了。
状态模式结构演示
状态抽象类:State
定义一个接口以封装与Context的一个特定状态相关的行为。
abstract class State{ public abstract void Handle(Context context); }
具体状态类:ConcreteState
每一个子类实现一个与Context的一个状态相关的行为。
class ConcreteStateA:State{ public override void Handle(Context context) => context.State = new ConcreteStateB(); } class ConcreteStateB : State{ public override void Handle(Context context) => context.State = new ConcreteStateA(); }
上下文类:Context
其实例定义当前的状态,维护一个具体状态类子类的实例
class Context{ public State state; public State State{ get{ return state; } set{ state = value; Console.WriteLine($"当前状态:{state.GetType().Name}"); } } public Context(State state) => this.state = state; public void Request() => state.Handle(this); }
测试类:Program
Context context = new Context(new ConcreteStateA()); context.Request(); context.Request(); context.Request(); context.Request(); //测试结果 当前状态:ConcreteStateB 当前状态:ConcreteStateA 当前状态:ConcreteStateB 当前状态:ConcreteStateA