[私人筆記] - 狀態模式

Design pattern - state pattern
這也是比較偏 寫給自己看的私人筆記 並不會做太多解釋

整理一下 遇到用 bool 去分辨狀態時 怎樣用 狀態模式 讓職責切開來

 情境一 : 第一次不用執行 , 第二次含以後 才要執行

var flow = FakeService.GetFlow();
//第一次不處理
if (IsFirst) 
{
    IsFirst = false;
    return;
}
Submit(flow);

這樣就是有兩個狀態
1.第一次的狀態
2.非第一次的狀態
就可以把改成

var flow = FakeService.GetFlow();
this.EventSender.SendEvent(flow);
this.EventSender = this.EventSender.Open();

這樣就可以把要不要執行的職責讓 EventSender 去決定

情境一這樣 只需要單向的改變  也可以簡化一下作法 ( 減少建立物件 )

public SituationA_StateLite(Func<int, bool> submit)
{
     this.Submit = submit;
     this.EventSender = new EventSender(x => false);
}
public void Work()
{
     var flow = FakeService.GetFlow();
     this.EventSender.SendEvent(flow);
     this.EventSender.Open(this.Submit);
}

 情境二  單數才要執行 , 雙數不執行

var flow = FakeService.GetFlow();
//單數才處理
if (IsOdd) 
{
    Submit(flow);
    IsOdd = !IsOdd;
}

也是需要 bool 去區分狀態 也可用狀態模式去寫

namespace DesignPatternTraining._01_State
{
    public class SituationB_State
    {
        public Func<int, bool> Submit { get; set; }
        private IFakeService FakeService { get; set; }
        private IEventSenderB EventSender { get; set; }

        public SituationB_State(Func<int, bool> submit)
        {
            this.Submit = submit;
            this.EventSender = new OddEventSender(this.Submit);
        }
        public void Work()
        {
            var flow = FakeService.GetFlow();
            this.EventSender = this.EventSender.SendEvent(flow);
        }
    }

    internal interface IEventSenderB
    {
        IEventSenderB SendEvent(int flow);
    }

    internal class EvenEventSender : IEventSenderB
    {
        public Func<int, bool> Trigger { get; set; }
        public EvenEventSender(Func<int, bool> trigger)
        {
            this.Trigger = trigger;
        }
        public IEventSenderB SendEvent(int flow)
        {
            //偶數不處理
            return new OddEventSender(this.Trigger);
        }
    }

    internal class OddEventSender : IEventSenderB
    {
        public Func<int, bool> Trigger { get; set; }
        public OddEventSender(Func<int, bool> trigger)
        {
            this.Trigger = trigger;
        }

        public IEventSenderB SendEvent(int flow)
        {
            this.Trigger(flow);
            return new EvenEventSender(this.Trigger);
        }
    }
}

 狀態模式 => 狀態物件 知道接下來的狀態 所以可以直接指定下一個狀態
- 單數執行 偶數不執行 => 所以單數狀態執行後指定為偶數狀態 , 偶數狀態執行後 指定為單數狀態 

程式碼 

如果內容有誤請多鞭策謝謝