C#设计模式-状态模式

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

 案例概述

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

Light类实现

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(); // 重置为初始状态}
}

灯状态接口定义:

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

OnLight1(状态1)

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

OnLight2(状态2)

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

OnLight3(状态3)

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

winform调用案例:

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

    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)适用场景

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac系统升级node.js版本和npm版本并安装pnpm

1.升级node.js版本 第一步:查询当前node.js版本 node -v第二步:清除node.js的缓存 sudo npm cache clean -f第三步:验证缓存是否清空 npm cache verify第四步:安装n工具,n工具是专门用于管理node.js版本的工具 su…

[net 5] udp_dict_server 基于udp的简单字典翻译(服务器与业务相分离)

目录 1. 功能了解 1.1. 啥是 dic_server? 1.2. dic_server 的小目标 2. 基本框架 2.1. 基本文件框架 2.2. 业务与服务器解耦 -> 回调函数 3. 字典 3.1. 字典配置文件 3.2. 构建字典类 3.2.1. 字典类的基本成员 3.2.2. 字典类构造 3.2.2.1. 构造 3.2.2.2. 信息加…

七种驱动器综合对比——《器件手册--驱动器》

九、驱动器 名称 功能与作用 工作原理 优势 应用 隔离式栅极驱动器 隔离式栅极驱动器用于控制功率晶体管(如MOSFET、IGBT、SiC或GaN等)的开关,其核心功能是将控制信号从低压侧传输到高压侧的功率器件栅极,同时在输入和输出之…

EM储能网关ZWS智慧储能云应用(8) — 电站差异化支持

面对不同项目、种类繁多的储能产品,如何在储能云平台上进行电站差异化支持尤为关键,ZWS智慧储能云从多方面支持储能电站差异化。 简介 随着行业发展,市场“内卷”之下,各大储能企业推陈出新的速度加快。面对不同项目、种类繁多…

图像预处理-色彩空间补充,灰度化与二值化

一.图像色彩空间转换 1.1 HSV颜色空间 HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色 一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本…

Midnight Flag CTF 2025

周末还是三个比赛,可惜不好弄。不是远端连不上就是远端打不开。再有就是太难了。 Crypto ABC 这个题还是不算难的。给了两个30位数的平方和,并且pu1*baser0,qu2*baser1其中r 都很小,可以copper。 只是sage里的two_squres不管用&#xff0…

深度学习--激活函数

激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…

深入解析 OrdinalEncoder 与 OneHotEncoder:核心区别与实战应用

标题:深入解析 OrdinalEncoder 与 OneHotEncoder:核心区别与实战应用 摘要: 本文详细探讨了机器学习中类别特征编码的两种核心方法——OrdinalEncoder 和 OneHotEncoder。通过对比两者的功能、特点、适用场景及代码实现,帮助读者…

CTF web入门之命令执行 完整版

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…

【Linux实践系列】:用c/c++制作一个简易的进程池

🔥 本文专栏:Linux Linux实践项目 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 人生没有标准答案,你的错题本也能写成传奇。 ★★★ 本文前置知识: 匿名管道 1.前置知识回顾…

2.2 函数返回值

1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型:function -函数的ID:16进制的整数数值 -函数的值:封装在函数中的数据和代码 # - 函数是一块内存空间,通过…

【3GPP核心网】【5G】精讲5G网络语音业务系统架构

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 1. 音视频业务 2. 消息类业务 SMS over IMS SMS over NAS 3. 互联互通架构 3.1 音视频业务互通场景 3.2 5G 用户与 5G 用户互通 3.3 5G 用户与 4G 用户的互通…

系统环境变量有什么实际作用,为什么要配置它

系统环境变量有什么实际作用,为什么要配置它 系统环境变量具有以下重要实际作用: 指定程序路径:操作系统通过环境变量来知晓可执行文件、库文件等的存储位置例如,当你在命令提示符或终端中输入一个命令时,系统会根据环境变量PATH中指定的路径去查找对应的可执行文件。如果…

qt/C++面试题自用学习(更新中)

最近在找工作…面试中遇到了的问题总以为自己会但回答的时候磕磕巴巴,觉得还是要总结一下: vector和list的区别 vector list 底层数据结构 基于动态数组实现,元素在内存中连续存储 基于双向链表实现,元素在内存中非连续存储&…

Day09【基于Tripletloss实现的简单意图识别对话系统】

基于Tripletloss实现的表示型文本匹配 目标数据准备参数配置数据处理Triplet Loss目标Triplet Loss计算公式公式说明 模型构建网络结构设计网络训练目标损失函数设计 主程序推理预测类初始化加载问答知识库文本向量化知识库查询主程序main测试测试效果 参考博客 目标 在此之前…

说说什么是幂等性?

大家好,我是锋哥。今天分享关于【说说什么是幂等性?】面试题。希望对大家有帮助; 说说什么是幂等性? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 幂等性(Idempotence) 是指在某些操作或请求…

【自相关】全局 Moran’s I 指数

自相关(Autocorrelation),也称为序列相关性,指的是同一变量在不同时间或空间点的值之间的关系。简而言之,自相关就是一个变量与自身在不同位置或时间点的相关性 自相关:针对同一属性之间进行分析相关性 本…

【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8

🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…

KrillinAI:视频跨语言传播的一站式AI解决方案

引言 在全球内容创作领域,跨语言传播一直是内容创作者面临的巨大挑战。传统的视频本地化流程繁琐,涉及多个环节和工具,不仅耗时耗力,还常常面临质量不稳定的问题。随着大语言模型(LLM)技术的迅猛发展,一款名为Krillin…