我花了最後一天的時間來嘗試確定哪種模式最適合我的特定場景,並且我一直在折磨着狀態模式&策略模式。當我在互聯網上閱讀示例時,它非常有意義......但它是另一種嘗試將它應用於自己的問題的技巧。我會描述我的情況和我面臨的問題,希望有人能指出我正確的方向。面向對象程序設計問題 - 狀態設計模式
問題:我有一個具有不同同步狀態的基礎對象:即最新,舊,從未發佈,未發佈等。現在取決於對象在行爲中的狀態是不同的,例如,您無法獲取最新版本對於從未發佈的基礎對象。在這一點上,國家設計模式似乎是最適合的...所以我已經實施了它,現在每個州都有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歲以下兒童×5種不同的狀態),而似乎只是絕對瘋了...爲什麼我在這裏!
任何幫助將不勝感激。如果它是混淆請讓我知道,所以我可以澄清!
Cheers
你究竟是什麼意思?*「從基類派生的10個不同的子對象」*?這部分有點混亂。 – acdcjunior 2013-05-04 05:34:58
我已經添加了一些示例代碼來幫助說明問題。在這種情況下,只有兩個子對象,即DocumentSubtype1&DocumentSubtype2 – Fred 2013-05-04 05:56:41