【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();
    }
}

运行结果

相关推荐
玩泥巴的3 小时前
存储那么贵,何不白嫖飞书云文件空间
c#·.net·二次开发·飞书
敲代码的约德尔人11 小时前
JavaScript 设计模式完全指南
javascript·设计模式
脑电信号要分类14 小时前
将多张图片拼接成一个pdf文件输出
pdf·c#·apache
njsgcs14 小时前
c# solidworks 折弯系数检查
开发语言·c#
han_15 小时前
JavaScript设计模式(二):策略模式实现与应用
前端·javascript·设计模式
格林威15 小时前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
唐青枫16 小时前
C#.NET SignalR + Redis Backplane 深入解析:多节点部署与跨实例消息同步
c#·.net
阿珊和她的猫18 小时前
微信小程序静默授权异步问题的处理方案
微信小程序·状态模式·notepad++
FL16238631291 天前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
love530love1 天前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw