我們把影響物件行為的一個或多個動態變化的屬性稱為狀態,狀態模式所處理的物件是有狀態的,當然狀態復雜才能體現出模式的精髓,
簡單一點例子就是等紅路燈
namespace 狀態模式一 { internal class Program { static void Main(string[] args) { TrafficLight trafficLight = new TrafficLight(new GreenLightState()); trafficLight.Show(); trafficLight.SetState(new YellowLightState()); trafficLight.Show(); trafficLight.SetState(new RedLightState()); trafficLight.Show(); } } /// <summary> /// 定義狀態的抽象類 /// </summary> public abstract class TrafficLighState { public abstract void Display(); } #region 具體實作 public class RedLightState : TrafficLighState { public override void Display() { Console.WriteLine("RedLight"); } } public class GreenLightState : TrafficLighState { public override void Display() { Console.WriteLine("GreenLight"); } } public class YellowLightState : TrafficLighState { public override void Display() { Console.WriteLine("YellowLight"); } } #endregion /// <summary> /// 狀態控制類 /// </summary> public class TrafficLight { private TrafficLighState trafficLighState; public TrafficLight(TrafficLighState trafficLighState) { this.trafficLighState = trafficLighState; } public void SetState(TrafficLighState state) { trafficLighState = state; } public void Show() { trafficLighState.Display(); } } }
上面實體狀態控制類控制的是一個狀態的型別,看起來很眼熟,比如策略模式(他是通過委托來控制行為),又比如模板方法(通過繼承來控制行為),只不過這里是控制一個狀態類,
下面通過汽車的狀態舉的例子:
using System.Numerics; using static System.Runtime.InteropServices.JavaScript.JSType; namespace 狀態模式二 { internal class Program { static void Main(string[] args) { var lamborghini = new Car(); Display(lamborghini.CurrentState); lamborghini.TaskAction(Action.Start); Display(lamborghini.CurrentState); lamborghini.TaskAction(Action.Start); Display(lamborghini.CurrentState); lamborghini.TaskAction(Action.Accelerate); //加速 Display(lamborghini.CurrentState); lamborghini.TaskAction(Action.Stop); Display(lamborghini.CurrentState); /* result 車輛當前狀態: Stopped 車輛當前狀態:Started 車輛當前狀態:Started 車輛當前狀態:Running 車輛當前狀態:Stopped */ } static void Display(State state) { Console.WriteLine($"車輛當前狀態:{state}"); } } /// <summary> /// 模擬汽車的狀態和駕駛員的動作判斷車輛當前的狀態 /// </summary> public class Car { private State state = State.Stopped; public State CurrentState { get { return state; } } public void TaskAction(Action action) { state = (state, action) switch { (State.Stopped, Action.Start) => State.Started, (State.Started, Action.Accelerate) => State.Running, (State.Started, Action.Stop) => State.Stopped, (State.Running, Action.Stop) => State.Stopped, _ => state }; } } public enum State { Stopped, Started, Running } public enum Action { Stop, Start, Accelerate } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/543638.html
標籤:其他
上一篇:狀態模式
下一篇:初探富文本之CRDT協同演算法
