1.特点:当对象内状态改变而执行不同操作时考虑,状态转移逻辑不在if/switch中,而在各子类之间,增/改状态和状态转换较容易。
2.概念:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
3.类图:
4.程序实现:
/// <summary> /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。 /// </summary> public class Context { private State state; /// <summary> /// 定义Context的初始状态 /// </summary> /// <param name="state"></param> public Context(State state) { this.state = state; } /// <summary> /// 可读写的状态属性,用于读取和设置新状态 /// </summary> public State State { get { return state; } set { state = value; } } /// <summary> /// 对请求做处理,并设置下一个状态 /// </summary> public void Request() { state.Handle(this); } } /// <summary> /// 抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为 /// </summary> public abstract class State { public abstract void Handle(Context context); } /// <summary> /// 具体状态类,每一个子类实现一个与Context的一个状态相关的行为 /// </summary> public class ConcreteStateA : State { /// <summary> /// 设置ConcreteStateA的下一个状态是ConcreteStateB /// </summary> /// <param name="context"></param> public override void Handle(Context context) { Console.WriteLine("当前状态是 A."); context.State = new ConcreteStateB(); } } public class ConcreteStateB : State { /// <summary> /// 设置ConcreteStateB的下一个状态是ConcreteSateA /// </summary> /// <param name="context"></param> public override void Handle(Context context) { Console.WriteLine("当前状态是 B."); context.State = new ConcreteStateA(); } } class Program { static void Main(string[] args) { // 设置Context的初始状态为ConcreteStateA Context context = new Context(new ConcreteStateA()); // 不断地进行请求,同时更改状态 context.Request(); context.Request(); context.Request(); context.Request(); Console.Read(); } }