class Program { static void Main(string[] args) { var state = new OpeningState(); var lift = new Lift(); lift.SetListState(state); lift.Close(); lift.Open(); lift.Run(); lift.Stop(); Console.Read(); } } public abstract class LiftState { protected Lift Lift; public void SetLift(Lift lift) { this.Lift = lift; } public abstract void Open(); public abstract void Close(); public abstract void Run(); public abstract void Stop(); } public class OpeningState : LiftState { public override void Open() { Console.WriteLine("电梯打开!"); } public override void Close() { base.Lift.SetListState(Lift.CloseingState); base.Lift.Close(); } public override void Run() { Console.WriteLine("打开不能运行"); } public override void Stop() { base.Lift.SetListState(Lift.StopingState); base.Lift.Stop(); } } public class ClosingState : LiftState { public override void Open() { base.Lift.SetListState(Lift.OpeningState); base.Lift.Open(); } public override void Close() { Console.WriteLine("电梯关闭!"); } public override void Run() { base.Lift.SetListState(Lift.RuningState); base.Lift.Open(); } public override void Stop() { base.Lift.SetListState(Lift.StopingState); base.Lift.Stop(); } } public class RuningState : LiftState { public override void Open() { base.Lift.SetListState(Lift.OpeningState); base.Lift.Open(); } public override void Close() { base.Lift.SetListState(Lift.CloseingState); base.Lift.Close(); } public override void Run() { Console.WriteLine("电梯运行!"); } public override void Stop() { base.Lift.SetListState(Lift.StopingState); base.Lift.Stop(); } } public class StopingState : LiftState { public override void Open() { base.Lift.SetListState(Lift.OpeningState); base.Lift.Open(); } public override void Close() { base.Lift.SetListState(Lift.CloseingState); base.Lift.Close(); } public override void Run() { base.Lift.SetListState(Lift.RuningState); base.Lift.Open(); } public override void Stop() { Console.WriteLine("电梯停止!"); } } public class Lift { public static LiftState OpeningState = new OpeningState(); public static LiftState CloseingState = new ClosingState(); public static LiftState RuningState = new RuningState(); public static LiftState StopingState = new StopingState(); private LiftState _liftState; public LiftState GetState() { return this._liftState; } public void SetListState(LiftState state) { this._liftState = state; this._liftState.SetLift(this); } public void Open() { this._liftState.Open(); } public void Close() { this._liftState.Close(); } public void Stop() { this._liftState.Stop(); } public void Run() { this._liftState.Run(); } }