나는 특정 패턴에 가장 적합한 패턴을 찾기 위해 마지막 날을 보냈으며 상태 패턴 & 전략 패턴 사이에 던져 넣었습니다. 인터넷에서 예제를 읽을 때 그것은 완벽하게 이해됩니다 ...하지만 실제로 다른 문제를 자신의 문제에 적용하려고합니다. 내 시나리오와 내가 직면 한 문제를 설명하고 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.OO 프로그래밍 문제 - 상태 디자인 패턴
문제 : 다른 동기화 상태 (예 : 최신, 이전, 게시되지 않음, 게시되지 않음 등)가있는 기본 개체가 있습니다. 개체가 동작의 상태에 따라 달라집니다. 예를 들어 최신 버전을 가져올 수 없습니다. 게시 된 적이없는 기본 객체의 경우 이 시점에서 상태 디자인 패턴이 가장 적합하다고 생각합니다 ... 그래서 구현했고 각 상태는 CanGetLatestVersion, GetLatestVersion, CanPublish, Publish 등과 같은 메소드를가집니다.
이 시점에서 모두 좋은 것처럼 보입니다. 하지만 기본 클래스에서 파생 된 10 가지 자식 개체가 있다고 가정 해 봅시다. "publish"메서드가 각 상태에 대해 실행될 때 자식 개체의 속성이 실제로 작업을 수행하지만 각 상태를 필요로하므로 내 솔루션이 손상됩니다 기본 객체에 대한 참조 만 있습니다. 방금 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
문제를 설명하기 위해 몇 가지 샘플 코드를 추가했습니다.이 인스턴스에는 하위 개체가 두 개만 있습니다. 즉, DocumentSubtype1 & DocumentSubtype2 – Fred