状态模式案例解析:三态循环灯的实现
案例概述
本案例使用 状态模式(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)适用场景
-
对象的行为取决于它的状态,并且需要在运行时动态切换。
-
代码中包含大量与状态相关的条件语句时,可以用状态模式优化。