私は最終日、どのパターンが自分の特定のシナリオに最も適しているかを考えようとしましたが、State パターンと Strategy パターンの間を行き来しました。私がインターネットで例を読んだとき、それは完全に理にかなっています... しかし、実際にそれを自分の問題に適用しようとするのは別のスキルです. 私のシナリオと直面している問題について説明します。うまくいけば、誰かが私を正しい方向に向けることができます.
問題: さまざまな同期状態 (最新、古い、未公開、未公開など) を持つベース オブジェクトがあります。オブジェクトの状態によって動作が異なります。たとえば、ベース オブジェクトの最新バージョンを取得できません。それは公開されたことがない。この時点で、State 設計パターンが最も適しているように思えます...それを実装したところ、各状態に CanGetLatestVersion、GetLatestVersion、CanPublish、Publish などのメソッドが含まれるようになりました。
この時点ですべてが良さそうです。しかし、基本クラスから派生した10個の異なる子オブジェクトがあるとしましょう...各状態に対して「公開」メソッドが実行されると、実際に操作を実行するには子オブジェクトのプロパティが必要ですが、各状態が必要になるため、私のソリューションは壊れていますベースオブジェクトへの参照のみがあります。C# での問題を説明するサンプル プロジェクトの作成に時間を費やしました。
public class BaseDocument
{
private IDocumentState _documentState;
public BaseDocument(IDocumentState documentState)
{
_documentState = documentState;
}
public bool CanGetLatestVersion()
{
return _documentState.CanGetLatestVersion(this);
}
public void GetLatestVersion()
{
if(CanGetLatestVersion())
_documentState.CanGetLatestVersion(this);
}
public bool CanPublish()
{
return _documentState.CanPublish(this);
}
public void Publish()
{
if (CanPublish())
_documentState.Publish(this);
}
internal void Change(IDocumentState documentState)
{
_documentState = documentState;
}
}
public class DocumentSubtype1 : BaseDocument
{
public string NeedThisData { get; set; }
}
public class DocumentSubtype2 : BaseDocument
{
public string NeedThisData1 { get; set; }
public string NeedThisData2 { get; set; }
}
public interface IDocumentState
{
bool CanGetLatestVersion(BaseDocument baseDocument);
void GetLatestVersion(BaseDocument baseDocument);
bool CanPublish(BaseDocument baseDocument);
bool Publish(BaseDocument baseDocument);
SynchronizationStatus Status { get; set; }
}
public class LatestState : IDocumentState
{
public bool CanGetLatestVersion(BaseDocument baseDocument)
{
return false;
}
public void GetLatestVersion(BaseDocument baseDocument)
{
throw new Exception();
}
public bool CanPublish(BaseDocument baseDocument)
{
return true;
}
public bool Publish(BaseDocument baseDocument)
{
//ISSUE HERE... I need to access the properties in the the DocumentSubtype1 or DocumentSubType2 class.
}
public SynchronizationStatus Status
{
get
{
return SynchronizationStatus.LatestState;
}
}
}
public enum SynchronizationStatus
{
NeverPublishedState,
LatestState,
OldState,
UnpublishedChangesState,
NoSynchronizationState
}
次に、各子オブジェクトの状態を実装することを考えました...これはうまくいきますが、50個のクラス、つまり(10個の子 x 5個の異なる状態)を作成する必要があり、それはまったくクレイジーに思えます...なぜ私はここにいるのですか?
どんな助けでも大歓迎です。わかりにくい場合はお知らせください。明確にすることができます。
乾杯