namespace RefactoringGuru.DesignPatterns.State.Conceptual
private State _state = null;
public Context(State state)
this.TransitionTo(state);
public void TransitionTo(State state)
Console.WriteLine($"Context: Transition to {state.GetType().Name}.");
this._state.SetContext(this);
protected Context _context;
public void SetContext(Context context)
public abstract void Handle1();
public abstract void Handle2();
class ConcreteStateA : State
public override void Handle1()
Console.WriteLine("ConcreteStateA handles request1.");
Console.WriteLine("ConcreteStateA wants to change the state of the context.");
this._context.TransitionTo(new ConcreteStateB());
public override void Handle2()
Console.WriteLine("ConcreteStateA handles request2.");
class ConcreteStateB : State
public override void Handle1()
Console.Write("ConcreteStateB handles request1.");
public override void Handle2()
Console.WriteLine("ConcreteStateB handles request2.");
Console.WriteLine("ConcreteStateB wants to change the state of the context.");
this._context.TransitionTo(new ConcreteStateA());
static void Main(string[] args)
var context = new Context(new ConcreteStateA());