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

运行结果

相关推荐
是阿根24 分钟前
unity使用iTextSharp生成PDF文件
unity·c#·游戏引擎
摘星编程1 小时前
并发设计模式实战系列(6):读写锁
java·设计模式·并发编程
ABAP 成2 小时前
.NET Framework 4.0可用EXCEL导入至DataTable
c#
Allen Bright3 小时前
【设计模式-4】深入理解设计模式:工厂模式详解
设计模式
碎梦归途4 小时前
23种设计模式-结构型模式之适配器模式(Java版本)
java·开发语言·jvm·单例模式·设计模式·适配器模式
WineMonk4 小时前
C#多线程访问资源
c#
Bardb4 小时前
04-stm32的标准外设库
stm32·c#
风,停下5 小时前
C#基于Sunnyui框架和MVC模式实现用户登录管理
设计模式·c#·mvc
钢铁男儿5 小时前
C# 实战_RichTextBox选中某一行条目高亮,离开恢复
开发语言·c#
苏近之6 小时前
说明白 Rust 中的泛型: 泛型是一种多态
设计模式·rust