找回密码
 立即注册
首页 业界区 业界 状态模式

状态模式

菅舛 2025-6-6 08:56:07
我们把影响对象行为的一个或多个动态变化的属性称为状态,状态模式所处理的对象是有状态的,当然状态复杂才能体现出模式的精髓。
简单一点例子就是等红路灯
  1. namespace 状态模式一
  2. {
  3.     internal class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             TrafficLight trafficLight = new TrafficLight(new GreenLightState());
  8.             trafficLight.Show();
  9.             trafficLight.SetState(new YellowLightState());
  10.             trafficLight.Show();
  11.             trafficLight.SetState(new RedLightState());
  12.             trafficLight.Show();
  13.         }
  14.     }
  15.     /// <summary>
  16.     /// 定义状态的抽象类
  17.     /// </summary>
  18.     public abstract class TrafficLighState
  19.     {
  20.         public abstract void Display();
  21.     }
  22.     #region 具体实现
  23.     public class RedLightState : TrafficLighState
  24.     {
  25.         public override void Display()
  26.         {
  27.             Console.WriteLine("RedLight");
  28.         }
  29.     }
  30.     public class GreenLightState : TrafficLighState
  31.     {
  32.         public override void Display()
  33.         {
  34.             Console.WriteLine("GreenLight");
  35.         }
  36.     }
  37.     public class YellowLightState : TrafficLighState
  38.     {
  39.         public override void Display()
  40.         {
  41.             Console.WriteLine("YellowLight");
  42.         }
  43.     }
  44.     #endregion
  45.     /// <summary>
  46.     /// 状态控制类
  47.     /// </summary>
  48.     public class TrafficLight
  49.     {
  50.         private TrafficLighState trafficLighState;
  51.         public TrafficLight(TrafficLighState trafficLighState)
  52.         {
  53.             this.trafficLighState = trafficLighState;
  54.         }
  55.         public void SetState(TrafficLighState state)
  56.         {
  57.             trafficLighState = state;
  58.         }
  59.         public void Show()
  60.         {
  61.             trafficLighState.Display();
  62.         }
  63.     }
  64. }
复制代码
上面实例状态控制类控制的是一个状态的类型,看起来很眼熟,比如策略模式(他是通过委托来控制行为),又比如模板方法(通过继承来控制行为),只不过这里是控制一个状态类。
下面通过汽车的状态举的例子:
  1. using System.Numerics;
  2. using static System.Runtime.InteropServices.JavaScript.JSType;
  3. namespace 状态模式二
  4. {
  5.     internal class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             var lamborghini = new Car();
  10.             Display(lamborghini.CurrentState);
  11.             lamborghini.TaskAction(Action.Start);
  12.             Display(lamborghini.CurrentState);
  13.             lamborghini.TaskAction(Action.Start);
  14.             Display(lamborghini.CurrentState);
  15.             lamborghini.TaskAction(Action.Accelerate); //加速
  16.             Display(lamborghini.CurrentState);
  17.             lamborghini.TaskAction(Action.Stop);
  18.             Display(lamborghini.CurrentState);
  19.             /* result
  20.                 车辆当前状态: Stopped
  21.                 车辆当前状态:Started
  22.                 车辆当前状态:Started
  23.                 车辆当前状态:Running
  24.                 车辆当前状态:Stopped
  25.             */
  26.         }
  27.         static void Display(State state)
  28.         {
  29.             Console.WriteLine($"车辆当前状态:{state}");
  30.         }
  31.     }
  32.     /// <summary>
  33.     /// 模拟汽车的状态和驾驶员的动作判断车辆当前的状态
  34.     /// </summary>
  35.     public class Car
  36.     {
  37.         private State state = State.Stopped;
  38.         public State CurrentState { get { return state; } }
  39.         public void TaskAction(Action action)
  40.         {
  41.             state = (state, action) switch
  42.             {
  43.                 (State.Stopped, Action.Start) => State.Started,
  44.                 (State.Started, Action.Accelerate) => State.Running,
  45.                 (State.Started, Action.Stop) => State.Stopped,
  46.                 (State.Running, Action.Stop) => State.Stopped,
  47.                 _ => state
  48.             };
  49.         }
  50.     }
  51.     public enum State { Stopped, Started, Running }
  52.     public enum Action { Stop, Start, Accelerate }
  53. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册