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

运行结果

相关推荐
云草桑2 小时前
C#入坑JAVA 使用XXLJob
java·开发语言·c#
玉夏3 小时前
【每日算法C#】爬楼梯问题 LeetCode
算法·leetcode·c#
天才测试猿8 小时前
WebUI自动化测试:POM设计模式全解析
自动化测试·软件测试·python·selenium·测试工具·设计模式·测试用例
Asort8 小时前
JavaScript设计模式(十三)——责任链模式:构建灵活高效的请求处理链
前端·javascript·设计模式
笨手笨脚の8 小时前
设计模式-访问者模式
设计模式·访问者模式·行为型设计模式
bkspiderx8 小时前
C++设计模式之行为型模式:模板方法模式(Template Method)
c++·设计模式·模板方法模式
o0向阳而生0o8 小时前
108、23种设计模式之模板方法模式(17/23)
设计模式·模板方法模式
云草桑9 小时前
.net AI MCP 入门 适用于模型上下文协议的 C# SDK 简介(MCP)
ai·c#·.net·mcp
工程师00710 小时前
C#中堆和栈的概念
c#·堆和栈
mit6.82411 小时前
[Backstage] 插件架构 | 软件目录 | 实体的生命周期
架构·状态模式