状态机 - State Machine! C#.Net模拟电梯控制系统!
状态机 - State Machine! C#.Net模拟电梯控制系统!
状态机(State Machine)
状态机,一个十分难以理解的设计模式,是个超级逻辑思维的设计模式,在某些应用场景若不运用状态机真是不可想象,比如电梯控制系统,除了使用状态机没有其它更适合的设计模式!
当然,你可以写至少10000个 if 来判断电梯运行的各个状态,也可以实现滴!哈哈~ 若这样写的电梯系统是无法理解的不可维护的!
作者使用状态机模拟电梯系统

状态机接口
/// <summary>
/// 表示状态的接口
/// </summary>
public interface IElevatorState
{
void OpenDoor(); //开电梯门
void CloseDoor(); //关门
void Run(); //电梯运行(升/降)
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 表示状态的接口
/// </summary>
public interface IElevatorState
{
void OpenDoor(); //开电梯门
void CloseDoor(); //关门
void Run(); //电梯运行(升/降)
}
// 来源:www.CSFramework.com, C/S结构框架学习网
电梯测试界面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace StateMachine
{
public partial class frmTest : Form
{
public frmTest()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void button1_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试打开电梯门...");
ec.SetCurrentState(ec.StateRunning);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorOpening);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorOpened);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorClosing);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorClosed);
ec.OpenDoor();//测试打开电梯门
}
private void button2_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试关闭电梯门...");
ec.SetCurrentState(ec.StateRunning);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorOpening);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorOpened);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorClosing);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorClosed);
ec.CloseDoor();//测试关闭电梯门
}
private void button3_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试运行电梯...");
ec.SetCurrentState(ec.StateRunning);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorOpening);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorOpened);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorClosing);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorClosed);
ec.Run();//测试运行电梯
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace StateMachine
{
public partial class frmTest : Form
{
public frmTest()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void button1_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试打开电梯门...");
ec.SetCurrentState(ec.StateRunning);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorOpening);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorOpened);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorClosing);
ec.OpenDoor();//测试打开电梯门
ec.SetCurrentState(ec.StateDoorClosed);
ec.OpenDoor();//测试打开电梯门
}
private void button2_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试关闭电梯门...");
ec.SetCurrentState(ec.StateRunning);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorOpening);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorOpened);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorClosing);
ec.CloseDoor();//测试关闭电梯门
ec.SetCurrentState(ec.StateDoorClosed);
ec.CloseDoor();//测试关闭电梯门
}
private void button3_Click(object sender, EventArgs e)
{
ElevatorController ec = new ElevatorController(this.listBox1);
ec.WriteLog("...测试运行电梯...");
ec.SetCurrentState(ec.StateRunning);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorOpening);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorOpened);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorClosing);
ec.Run();//测试运行电梯
ec.SetCurrentState(ec.StateDoorClosed);
ec.Run();//测试运行电梯
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
电梯运行时状态
public class StateRunning : IElevatorState
{
private ElevatorController _ec;
public StateRunning(ElevatorController ec)
{
_ec = ec;
}
public void OpenDoor()
{
_ec.WriteLog("StateRunning.OpenDoor():[方法无效]不要命啦!电梯在升降中,不能开门!!!");
}
public void CloseDoor()
{
_ec.WriteLog("StateRunning.CloseDoor():[方法无效]电梯在运行,门已经是状态状态!!!");
}
public void Run()
{
_ec.WriteLog("StateRunning.Run():[方法无效]电梯已经在运行状态!!!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
关闭电梯门状态
public class StateDoorClosed : IElevatorState
{
private ElevatorController _ec;
public StateDoorClosed(ElevatorController ec)
{
_ec = ec;
}
public void OpenDoor()
{
_ec.WriteLog("StateDoorClosed.OpenDoor():正在关电梯门...");
_ec.SetCurrentState(_ec.StateDoorOpening);
}
public void CloseDoor()
{
_ec.WriteLog("StateDoorClosed.CloseDoor():[方法无效]:因电梯门已经是关闭状态!");
}
public void Run()
{
_ec.SetCurrentState(_ec.StateRunning);
_ec.WriteLog("StateDoorClosed.Run():正在启动电梯, 进入升降程序...");
if (_ec.IsUp)
_ec.WriteLog("StateDoorClosed.Run():电梯进入上升状态中...");
else if (_ec.IsDown)
_ec.WriteLog("StateDoorClosed.Run():电梯进入下降状态中...");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
{
private ElevatorController _ec;
public StateDoorClosed(ElevatorController ec)
{
_ec = ec;
}
public void OpenDoor()
{
_ec.WriteLog("StateDoorClosed.OpenDoor():正在关电梯门...");
_ec.SetCurrentState(_ec.StateDoorOpening);
}
public void CloseDoor()
{
_ec.WriteLog("StateDoorClosed.CloseDoor():[方法无效]:因电梯门已经是关闭状态!");
}
public void Run()
{
_ec.SetCurrentState(_ec.StateRunning);
_ec.WriteLog("StateDoorClosed.Run():正在启动电梯, 进入升降程序...");
if (_ec.IsUp)
_ec.WriteLog("StateDoorClosed.Run():电梯进入上升状态中...");
else if (_ec.IsDown)
_ec.WriteLog("StateDoorClosed.Run():电梯进入下降状态中...");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网

请下载附件!(Source for VIP)
参考文档:
C#.NET理解Task和async await原理-C/S开发框架
C#.Net对象内存模型及堆/栈数据结构详解 (一)
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
.NETCore WebApi后端开发框架+达梦数据库测试报告|C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
达梦数据库.NETCore.NET8实践指南|C/S软件开发框架|C/S开发框架
.NET代码生成器V6.1 - 快速生成Winform窗体代码
FastReport.NET v2021 打印预览报表出错NullReferenceException / RestoreEncodedText,踩坑!
C# .NET 6 新增的20个功能API,实例源码-C/S开发框架
C#.NET CLR垃圾回收机制-C/S开发框架
ASP.NET Web API入门介绍(一)-C/S开发框架
软件开发与设计 - EMS-电子商城系统-[电子商务]ASP.NET电子商务平台(毕业设计)
Win XP系统安装.NET Framework 4.0失败:一般信任关系失败解决方案
C#.NET iTextSharp生成PDF文件源码大全(生成表格、透明水印,页脚页眉页码等)
C# ASP.NET WebApi服务器搭建详解 - Win服务承载(Windows Service Hosting宿主)
C# ASP.NET WebApi服务器搭建详解 - 自承载(Self Hosting)
C#.NET理解Task和async await原理-C/S开发框架
C#.Net对象内存模型及堆/栈数据结构详解 (一)
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
.NETCore WebApi后端开发框架+达梦数据库测试报告|C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
达梦数据库.NETCore.NET8实践指南|C/S软件开发框架|C/S开发框架
.NET代码生成器V6.1 - 快速生成Winform窗体代码
FastReport.NET v2021 打印预览报表出错NullReferenceException / RestoreEncodedText,踩坑!
C# .NET 6 新增的20个功能API,实例源码-C/S开发框架
C#.NET CLR垃圾回收机制-C/S开发框架
ASP.NET Web API入门介绍(一)-C/S开发框架
软件开发与设计 - EMS-电子商城系统-[电子商务]ASP.NET电子商务平台(毕业设计)
Win XP系统安装.NET Framework 4.0失败:一般信任关系失败解决方案
C#.NET iTextSharp生成PDF文件源码大全(生成表格、透明水印,页脚页眉页码等)
C# ASP.NET WebApi服务器搭建详解 - Win服务承载(Windows Service Hosting宿主)
C# ASP.NET WebApi服务器搭建详解 - 自承载(Self Hosting)
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
