C#设计模式-状态模式

状态模式案例解析:三态循环灯的实现

案例概述

本案例使用 状态模式(State Pattern) 实现了一个 三态循环灯 的功能。每点击一次按钮,灯的状态会按顺序切换(状态1 → 状态2 → 状态3 → 状态1...),并在每次切换时弹出一个消息框显示当前状态。此外,还提供了 重置 功能,可以将灯的状态恢复到初始值。

Light类实现

cs 复制代码
public class Light
{
    public LightStateInterface Lightstate { get; set; } // 当前状态
    
    public Light()
    {
        Lightstate = new OnLight1(); // 初始状态为 OnLight1
    }
    
    public void Set()
    {
        Lightstate.btn_切换(this); // 调用当前状态的切换方法
    }
    
    public void reset()
    {
        Lightstate = new OnLight1(); // 重置为初始状态
    }
}

灯状态接口定义:

cs 复制代码
public interface LightStateInterface
{
    void btn_切换(Light mylight); // 切换状态的方法
}

OnLight1(状态1):

cs 复制代码
class OnLight1 : LightStateInterface
{
    public void btn_切换(Light mylight)
    {
        System.Windows.Forms.MessageBox.Show("灯-1"); // 显示当前状态
        mylight.Lightstate = new OnLight2(); // 切换到状态2
    }
}

OnLight2(状态2):

cs 复制代码
class OnLight2 : LightStateInterface
{
    public void btn_切换(Light mylight)
    {
        System.Windows.Forms.MessageBox.Show("灯-2"); // 显示当前状态
        mylight.Lightstate = new OnLight3(); // 切换到状态3
    }
}

OnLight3(状态3):

cs 复制代码
class OnLight3 : LightStateInterface
{
    public void btn_切换(Light mylight)
    {
        System.Windows.Forms.MessageBox.Show("灯-3"); // 显示当前状态
        mylight.Lightstate = new OnLight1(); // 切换回状态1
    }
}

winform调用案例:

在 WinForm 界面上提供 切换 和 重置 按钮,代码:

cs 复制代码
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Light light = new Light(); // 创建 Light 对象

        private void btn_切换灯_Click(object sender, EventArgs e)
        {
            light.Set(); // 切换状态
        }

        private void btn_重置_Click(object sender, EventArgs e)
        {
            light.reset(); // 重置状态
        }
    }

状态模式的核心思想

(1)状态模式的定义

状态模式是一种 行为型设计模式 ,允许对象在 内部状态改变时改变其行为,看起来像是修改了它的类。

(2)状态模式的优点

  • 符合开闭原则:新增状态时无需修改现有代码,只需新增类。

  • 消除复杂条件语句 :避免 if-else 或 switch-case 判断状态。

  • 状态转换逻辑清晰:每个状态类负责自己的转换逻辑。

(3)适用场景

  • 对象的行为取决于它的状态,并且需要在运行时动态切换。

  • 代码中包含大量与状态相关的条件语句时,可以用状态模式优化。

相关推荐
小马不起床5 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
曹牧9 小时前
C#:输入的字符串格式不正确
c#
博风10 小时前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
高晶11 小时前
ARM 嵌入式 Linux 系统 U-Boot 开发与移植实战M
设计模式·程序员
shmily麻瓜小菜鸡12 小时前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
根号五14 小时前
JetBrains Rider 使用教程(1)新建解决方案
c#·jetbrains rider
青企通14 小时前
APP 开发成本估算:从需求到上架的完整拆解与工作量模型
产品运营·状态模式
for_ever_love__14 小时前
LangGraph State 设计:多节点之间怎么安全地共享数据
redis·mysql·状态模式·checkpoint·state·状态图·langgraph
海天鹰14 小时前
C#:接收从打开方式打开的参数
c#
宝桥南山15 小时前
.NET 11 - 尝试一下Minimal API中的异步验证新特性
microsoft·微软·c#·asp.net·.net·.netcore