【C#设计模式(21)——状态模式(State Pattern)】

前言

状态模式:在对象内部发生改变时改变其行为,使得对象在不同的状态下具有不同的行为表现。

代码

csharp 复制代码
 #region 状态模式-类
 /// 抽象 交通灯状态
 public abstract class TrafficLightState
 {
     public abstract void Display();
 }
 //红灯
 public class RedLight : TrafficLightState
 {
     public override void Display()
     {
         Console.WriteLine("红灯停");
     }
 }
 //绿灯
 public class GreenLight : TrafficLightState
 {
     public override void Display()
     {
         Console.WriteLine("绿灯行");
     }
 }
 //黄灯
 public class YellowLight : TrafficLightState
 {
     public override void Display()
     {
         Console.WriteLine("黄灯等待");
     }
 }
 //交通灯上下文
 public class TrafficLightContext
 {
     private TrafficLightState trafficLight;

     public TrafficLightContext()
     {
         trafficLight = new RedLight();
     }
     public void SetTrafficLightState(TrafficLightState trafficLight)
     {
         this.trafficLight = trafficLight;
     }
     public void Display()
     {
         trafficLight.Display();
     }
 }
 #endregion

 #region 状态模式-枚举
 //交通灯状态枚举
 public enum TrafficLightEnum
 {
     Red,
     Green,
     Yellow
 }
 //交通灯枚举状态显示设置类
 public class TrafficLightEnumState
 {
     private TrafficLightEnum state;
     public void SetState(TrafficLightEnum state)
     {
         this.state = state;
     }
     public void Display()
     {
         switch (state)
         {
             case TrafficLightEnum.Red:
                 Console.WriteLine("红灯停");
                 break;
             case TrafficLightEnum.Green:
                 Console.WriteLine("绿灯行");
                 break;
             case TrafficLightEnum.Yellow:
                 Console.WriteLine("黄灯等待");
                 break;
         }
     }
 }
 //交通灯上下文(枚举设置)
 public class TrafficLightEnumContext
 {
     private TrafficLightEnumState trafficLight;
     public TrafficLightEnumContext()
     {
         trafficLight = new TrafficLightEnumState();
         trafficLight.SetState(TrafficLightEnum.Red);
     }
     public void SetTrafficLightState(TrafficLightEnum state)
     {
         trafficLight.SetState(state);
     }
     public void Display()
     {
         trafficLight.Display();
     }
 }
 #endregion


/*
 * 行为型模式:Behavioral Pattern
 * 状态模式:State Pattern
 */
internal class Program
{
    /*
     * 行为型模式:Behavioral Pattern
     * 状态模式:State Pattern
     */
    static void Main(string[] args)
    {
        //类模式
        Console.WriteLine("类模式......");
        TrafficLightContext trafficLight = new TrafficLightContext();
        trafficLight.Display();
        trafficLight.SetTrafficLightState(new GreenLight());
        trafficLight.Display();
        trafficLight.SetTrafficLightState(new YellowLight());
        trafficLight.Display();

        //枚举模式
        Console.WriteLine("枚举模式......");
        TrafficLightEnumContext trafficLightEnumContext = new TrafficLightEnumContext();
        trafficLightEnumContext.Display();
        trafficLightEnumContext.SetTrafficLightState(TrafficLightEnum.Green);
        trafficLightEnumContext.Display();
        trafficLightEnumContext.SetTrafficLightState(TrafficLightEnum.Yellow);
        trafficLightEnumContext.Display();

        Console.ReadLine();
    }
}

运行结果

相关推荐
yangpipi-2 小时前
2. 设计模式之结构型模式
设计模式
gc_22994 小时前
C#学习调用OpenMcdf模块解析ole数据的基本用法(1)
c#·ole·openmcdf
前端不太难4 小时前
HarmonyOS PC 文档模型完整范式
华为·状态模式·harmonyos
进击的小头7 小时前
设计模式组合应用:嵌入式通信协议栈
c语言·设计模式·策略模式
致Great7 小时前
智能体的设计模式探讨
设计模式
MM_MS8 小时前
Halcon图像点运算、获取直方图、直方图均衡化
图像处理·人工智能·算法·目标检测·计算机视觉·c#·视觉检测
BD_Marathon8 小时前
设计模式——单一职责原则
设计模式·单一职责原则
stevenzqzq9 小时前
Slot API 设计模式
设计模式·compose
reddingtons9 小时前
Cascadeur:动态总是“飘”?“物理外挂流” 3分钟直出重力感 2D 立绘
游戏·设计模式·aigc·设计师·游戏策划·游戏美术·cascadeur
前端不太难9 小时前
HarmonyOS 项目中如何拆分共用层与形态模型
华为·状态模式·harmonyos