「ワークアイテムの状態に応じて」状態設計パターンをもたらす
何らかの方法で、インターフェイスをリファクタリングし、最終的にクライアント コントラクトを破棄する必要があります。
私があなたの問題を正しく理解していれば、WorkItemProcessor に送信された WorkItem に応じて状態が変化する WorkItemProcessor があります。
したがって、 WorkItemProcessor は次のようになります
// Context
public class WorkItemProcessor
{
public IState CurrentState { get; set; }
public WorkItemProcessor(IState initialState)
{
CurrentState = initialState;
}
public void Process(WorkItem workItem)
{
CurrentState.Handle(this, workItem);
}
}
次に、WorkItemProcessor が潜在的に存在する可能性のある複数の状態を定義します。
// State Contract
public interface IState
{
void Handle(WorkItemProcessor processor, WorkItem item);
}
// State One
public class CompleteState : IState
{
public void Handle(WorkItemProcessor processor, WorkItem item)
{
processor.CurrentState = item.CompletenessConditionHoldsTrue ? (IState) this : new CancelState();
}
}
// State Two
public class CancelState : IState
{
public void Handle(WorkItemProcessor processor, WorkItem item)
{
processor.CurrentState = item.CancelConditionHoldsTrue ? (IState) this : new CompleteState();
}
}
WorkItemが次のように見えると仮定します
// Request
public class WorkItem
{
public bool CompletenessConditionHoldsTrue { get; set; }
public bool CancelConditionHoldsTrue { get; set; }
}
すべてをまとめるには
static void Main()
{
// Setup context in a state
WorkItemProcessor processor = new WorkItemProcessor(new CancelState());
var workItem1 = new WorkItem { CompletenessConditionHoldsTrue = true };
var workItem2 = new WorkItem { CancelConditionHoldsTrue = true };
// Issue requests, which toggles state
processor.Process(workItem1);
processor.Process(workItem2);
Console.Read();
}
これがあなたに近づくことを願っています。乾杯。