当前位置: 首页 > news >正文

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

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

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

 

相关文章:

  • Rust-引用借用规则
  • MyBatis持久层框架
  • 开源模型集成接口
  • C# 运行web项目
  • Maven 编译指定模版
  • Aosp13 文件应用点击apk无反应的处理
  • 日常学习开发记录-slider组件
  • Rocky Linux 9.x 基于 kubeadm部署k8s
  • 基于Tesseract与Opencv的电子发票识别[1]
  • Vue 人看 React useRef:它不只是替代 ref
  • cocos 3D自由世界游戏 - 开发
  • GitHub实用手册
  • Java项目之基于ssm的学校小卖部收银系统(源码+文档)
  • 获取 arm-none-eabi-ld 默认使用的链接脚本
  • 【2-10】E1与T1
  • CentOS 下 Zookeeper 常用命令与完整命令列表
  • element-ui colorPicker 组件源码分享
  • 音视频小白系统入门笔记-0
  • 多光谱相机与高光谱相机的区别
  • AI搜索引擎的局限性
  • 王毅谈金砖国家反恐和网络安全合作
  • 金砖国家外长会晤主席声明(摘要)
  • 擦亮“世界美食之都”金字招牌,淮安的努力不止于餐桌
  • 外媒称菲方允许菲官员窜台,国台办:应停止在台湾问题上玩火
  • 胸外科专家查出肺多发结节,说了一个可怕的事实……
  • 浙江官宣:五一假期,没电、没气、没油车辆全部免费拖离高速