行为型设计模式——状态模式
允许一个对象的内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用于
①一个对象的行为决定了它的状态,并且它必须在运行时刻改变状态改变他的行为。
②一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或者多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。
类图如下

1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 Elevator elevator = new Elevator(); 6 7 elevator.OpenDoor(); 8 elevator.CloseDoor(); 9 elevator.Run(); 10 elevator.Stop(); 11 12 //改变状态 13 elevator.SetState(new StopState(elevator)); 14 15 elevator.CloseDoor(); 16 elevator.Run(); 17 elevator.OpenDoor(); 18 elevator.Stop(); 19 20 } 21 }
1 /// <summary> 2 /// 状态接口 3 /// </summary> 4 internal interface IState 5 { 6 void OpenDoor(); 7 void CloseDoor(); 8 void Run(); 9 10 void Stop(); 11 }
1 /// <summary> 2 ///电梯类,聚合了状态类,用来进行状态变换 3 /// </summary> 4 internal class Elevator 5 { 6 private IState state; 7 8 public Elevator() 9 { 10 state = new StopState(this); 11 } 12 13 public void SetState(IState state) 14 { 15 this.state = state; 16 } 17 18 public void OpenDoor() 19 { 20 state.OpenDoor(); 21 } 22 23 public void CloseDoor() 24 { 25 state.CloseDoor(); 26 } 27 28 public void Run() 29 { 30 state.Run(); 31 } 32 33 public void Stop() 34 { 35 state.Stop(); 36 } 37 }
1 /// <summary> 2 /// 停止状态 3 /// </summary> 4 internal class StopState : IState 5 { 6 private Elevator context; 7 8 public StopState(Elevator context) 9 { 10 this.context = context; 11 } 12 13 public void OpenDoor() 14 { 15 Console.WriteLine("电梯门已打开。。。。"); 16 } 17 18 public void CloseDoor() 19 { 20 Console.WriteLine("电梯门已关闭。。。。"); 21 } 22 23 public void Run() 24 { 25 Console.WriteLine("电梯开始运行。。。"); 26 //切换到运行状态 27 context.SetState(new RunState(context)); 28 } 29 30 public void Stop() 31 { 32 Console.WriteLine("电梯已停止。。。"); 33 } 34 }
1 /// <summary> 2 /// 运行状态 3 /// </summary> 4 internal class RunState : IState 5 { 6 private Elevator context; 7 8 public RunState(Elevator context) 9 { 10 this.context = context; 11 } 12 public void CloseDoor() 13 { 14 Console.WriteLine("电梯正在运行,门是关闭的。。。"); 15 } 16 17 public void Run() 18 { 19 Console.WriteLine("电梯继续运行。。。"); 20 } 21 22 public void OpenDoor() 23 { 24 Console.WriteLine("电梯正在运行,无法开门。。。"); 25 } 26 27 public void Stop() 28 { 29 Console.WriteLine("电梯开始关闭。。。"); 30 //切换到停止状态 31 context.SetState(new RunState(context)); 32 } 33 }
1 /// <summary> 2 /// 故障状态 3 /// </summary> 4 internal class FaultState : IState 5 { 6 private Elevator context; 7 8 public FaultState(Elevator context) 9 { 10 this.context = context; 11 } 12 public void CloseDoor() 13 { 14 Console.WriteLine("电梯故障,无法关门。。。"); 15 } 16 17 public void OpenDoor() 18 { 19 Console.WriteLine("电梯故障,无法开门。。。"); 20 } 21 22 public void Run() 23 { 24 Console.WriteLine("电梯故障,无法启动。。。"); 25 } 26 27 public void Stop() 28 { 29 Console.WriteLine("电梯故障,已被强制关闭。。。"); 30 } 31 }

浙公网安备 33010602011771号