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);
}
}
}
狀態模式 => 狀態物件 知道接下來的狀態 所以可以直接指定下一個狀態
- 單數執行 偶數不執行 => 所以單數狀態執行後指定為偶數狀態 , 偶數狀態執行後 指定為單數狀態
如果內容有誤請多鞭策謝謝