狀態模式案例解析:三態循環燈的實現
?案例概述
本案例使用?狀態模式(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)適用場景
-
對象的行為取決于它的狀態,并且需要在運行時動態切換。
-
代碼中包含大量與狀態相關的條件語句時,可以用狀態模式優化。
?