using System; public class StatePattern { public static void Main(string[] argv) { Context c = new Context("my Context"); StateA sa = new StateA(); StateB sb = new StateB(); c.State = sa; c.Method(argv); c.State = sb; c.Method(argv); } } public abstract class State { private string _name; public State(string name) { this._name = name; } public override string ToString() { return this._name; } public abstract void Method(Context c, string[] args); } public class StateA : State { public StateA() : base("StateA") { } public override void Method(Context c, string[] args) { Console.WriteLine("{0} ({1}): {2}", this, c, String.Join(", ", args)); } } public class StateB : State { public StateB() : base("StateB") { } public override void Method(Context c, string[] args) { Console.WriteLine("{0} ({1}): {2}", this, c, String.Join("; ", args)); } } public class Context { public State State; private string _name; public Context(string name, State s) { this._name = name; this.State = s; } public Context(string name) : this(name, null) { } public override string ToString() { return this._name; } public void Method(string[] args) { if(this.State != null) this.State.Method(this, args); } }