状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
简单实现:
namespace StateMode { /// <summary> /// State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为 /// </summary> abstract class State { public abstract void Handle(Context context); } } namespace StateMode { /// <summary> /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态 /// </summary> class Context { private State state; //定义Context的初始状态 public Context(State state) { this.state = state; } //可读写的状态属性,读取当前状态和设置新状态 public State State { get { return state; } set { state = value; Console.WriteLine("当期状态:" + state.GetType().Name); } } /// <summary> /// 对请求处理,并设置下一状态 /// </summary> public void Request() { state.Handle(this); } } } namespace StateMode { /// <summary> /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为 /// </summary> class ConcreteStateA : State{ public override void Handle(Context context) { context.State = new ConcreteStateB(); } } } namespace StateMode { /// <summary> /// 具体状态,每一个子类实现一个 与Context的一个 状态 相关的行为 /// </summary> class ConcreteStateB : State { public override void Handle(Context context) { context.State = new ConcreteStateA(); } } } namespace StateMode { class Program { static void Main(string[] args) { Context c = new Context(new ConcreteStateA()); c.Request(); c.Request(); c.Request(); c.Request(); Console.Read(); } } } /*输出 当期状态:ConcreteStateB 当期状态:ConcreteStateA 当期状态:ConcreteStateB 当期状态:ConcreteStateA*/
来源:CSDN
作者:傻子是小傲娇
链接:https://blog.csdn.net/love_phoebe/article/details/104057099