// The Context allows changing the State object at runtime. publicvoidTransitionTo(State state) { Console.WriteLine($"Context: Transition to {state.GetType().Name}."); this._state = state; this._state.SetContext(this); }
// The Context delegates part of its behavior to the current State // object. publicvoidRequest1() { this._state.Handle1(); }
publicvoidRequest2() { this._state.Handle2(); } }
// The base State class declares methods that all Concrete State should // implement and also provides a backreference to the Context object, // associated with the State. This backreference can be used by States to // transition the Context to another State. abstractclassState { protected Context _context;
// Concrete States implement various behaviors, associated with a state of // the Context. classConcreteStateA : State { publicoverridevoidHandle1() { Console.WriteLine("ConcreteStateA handles request1."); Console.WriteLine("ConcreteStateA wants to change the state of the context."); this._context.TransitionTo(new ConcreteStateB()); }
classConcreteStateB : State { publicoverridevoidHandle1() { Console.Write("ConcreteStateB handles request1."); }
publicoverridevoidHandle2() { Console.WriteLine("ConcreteStateB handles request2."); Console.WriteLine("ConcreteStateB wants to change the state of the context."); this._context.TransitionTo(new ConcreteStateA()); } }
classProgram { staticvoidMain(string[] args) { // The client code. var context = new Context(new ConcreteStateA()); context.Request1(); context.Request2(); // output
// Context: Transition to ConcreteStateA. // ConcreteStateA handles request1. // ConcreteStateA wants to change the state of the context. // Context: Transition to ConcreteStateB. // ConcreteStateB handles request2. // ConcreteStateB wants to change the state of the context. // Context: Transition to ConcreteStateA. } } }