我花了最后一天的时间来尝试确定哪种模式最适合我的特定场景,并且我一直在折磨着状态模式&策略模式。当我在互联网上阅读示例时,它非常有意义......但它是另一种尝试将它应用于自己的问题的技巧。我会描述我的情况和我面临的问题,希望有人能指出我正确的方向。面向对象程序设计问题 - 状态设计模式
问题:我有一个具有不同同步状态的基础对象:即最新,旧,从未发布,未发布等。现在取决于对象在行为中的状态是不同的,例如,您无法获取最新版本对于从未发布的基础对象。在这一点上,国家设计模式似乎是最适合的...所以我已经实施了它,现在每个州都有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