我花了最后一天试图找出最适合我的特定场景的模式,我一直在状态模式和策略模式之间折腾。当我在 Internet 上阅读示例时,它非常有意义……但尝试将其实际应用于您自己的问题是另一种技能。我将描述我的场景和我面临的问题,希望有人能指出我正确的方向。
问题:我有一个具有不同同步状态的基础对象:即最新、旧、从未发布、未发布等。现在,根据对象所处的状态,行为会有所不同,例如,您无法获取基础对象的最新版本从未发表过。在这一点上,状态设计模式似乎最适合......所以我已经实现了它,现在每个状态都有 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 个不同的状态),这看起来绝对是疯狂的......因此我在这里!
任何帮助将不胜感激。如果令人困惑,请告诉我,以便我澄清!
干杯