public abstract class State
public abstract string Name{get;}
public abstract void Handle(Context context);
public void SetState(State state)
Console.WriteLine("The current state {0} \n", state.Name);
public class ConcreteStateA : State
public override string Name {get{return "ConcreteStateA";}}
public override void Handle(Context context)
Console.WriteLine("{0} - is handle here", this.Name);
context.SetState(new ConcreteStateB());
public class ConcreteStateB : State
public override string Name {get{return "ConcreteStateB";}}
public override void Handle(Context context)
Console.WriteLine("{0} - is handle here", this.Name);
context.SetState(new ConcreteStateA());
public static void Main()
ctx.SetState(new ConcreteStateB());