Я провел последний день, пытаясь разработать, какой шаблон лучше всего подходит для моего конкретного сценария, и я подбрасывал между шаблоном состояния Pattern &. Когда я читаю примеры в Интернете, это имеет смысл ... но это еще один навык, который пытается применить его к вашей собственной проблеме. Я опишу свой сценарий и проблему, с которой я столкнулся, и, надеюсь, кто-то может указать мне в правильном направлении.Проблема программирования OO - шаблон государственного дизайна
Проблема: у меня есть базовый объект, который имеет разные состояния синхронизации: т.е. последний, старый, никогда не опубликованный, не опубликованный и т. Д. Теперь, в зависимости от того, какое состояние объект в поведении отличается, например, вы не можете получить последнюю версию для базового объекта, который никогда не публиковался. На данный момент кажется, что модель дизайна штата лучше всего подходит ... поэтому я ее реализовал, и теперь у каждого штата есть такие методы, как 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 различных состояний) и что только кажется абсолютным сумасшедшим ... поэтому я здесь!
Любая помощь была бы принята с благодарностью. Если это смущает, пожалуйста, дайте мне знать, чтобы я мог уточнить!
Приветствия
Что именно вы подразумеваете под * «10 различных дочерних объектов, которые происходят из базового класса» *? Эта часть немного запутанна. – acdcjunior
Я добавил несколько примеров кода, чтобы помочь проиллюстрировать проблему.В этом случае есть только 2 дочерних объекта, то есть DocumentSubtype1 & DocumentSubtype2 – Fred