class Document is field state: string // ... method publish() is switch (state) "draft": state = "moderation" break "moderation": if (currentUser.role == 'admin') state = "published" break "published": // 什么也不做。 break // ...
namespaceRefactoringGuru.DesignPatterns.State.Conceptual { // The Context defines the interface of interest to clients. It also // maintains a reference to an instance of a State subclass, which // represents the current state of the Context. classContext { // A reference to the current state of the Context. private State _state = null;
// 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(); } } }
执行结果:
1 2 3 4 5 6 7
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.