namespace RefactoringGuru.DesignPatterns.State.Conceptual
private Estado _estado = null;
public Contexto(Estado estado)
this.TransicionA(estado);
public void TransicionA(Estado estado)
Console.WriteLine($"Contexto: Transición a {estado.GetType().Name}.");
this._estado.SetContext(this);
protected Contexto _contexto;
public void SetContext(Contexto contexto)
this._contexto = contexto;
public abstract void Manejar1();
public abstract void Manejar2();
class EstadoConcretoA : Estado
public override void Manejar1()
Console.WriteLine("EstadoConcretoA maneja solicitud1.");
Console.WriteLine("EstadoConcretoA quiere cambiar el estado del contexto.");
this._contexto.TransicionA(new EstadoConcretoB());
public override void Manejar2()
Console.WriteLine("EstadoConcretoA maneja solicitud2.");
class EstadoConcretoB : Estado
public override void Manejar1()
Console.Write("EstadoConcretoB maneja solicitud1.");
public override void Manejar2()
Console.WriteLine("EstadoConcretoB maneja solicitud2.");
Console.WriteLine("EstadoConcretoB quiere cambiar el estado del contexto.");
this._contexto.TransicionA(new EstadoConcretoA());
static void Main(string[] args)
var contexto = new Contexto(new EstadoConcretoA());