2010-07-22 3 views
0

У меня есть запроса класса, который может быть в одном из следующих состояний:Можно ли использовать шаблон состояния здесь?

Проекта, отправленного, Approved, отклоненных, InMission, Завершена

В состоянии Запрос объект можно изменить, вызвав один из следующих способов. Каждый метод может включать некоторые аргументы для дальнейшего связать некоторые данные с конкретным состоянием:

void Submit(string by) { } 
void Approve(string by, string comment) { } 
void Reject(string by, string comment) { } 
void AddToMission(Mission mission) { } 
void Complete() { } 

Я думал о реализации государственного образца здесь. Каждый из моих классов состояний будет содержать дополнительную информацию, связанную с ними. Моя основная идея реализовать государственные образец здесь не добавлять все это unreleated свойства в Запросе самого класса, как:

public string ApprovedBy; 
public string ApprovedComment; 
public string RejectedBy; 
public string RejectedComment; 
public Mission Mission; 

Как вы думаете государство модели является хорошим кандидатом для реализации здесь?

С уважением,

Мош

ответ

0

состояние картины имеет то преимущество, что вы не можете позвонить Complete() на проект, потому что он просто не имеет такой метод. Однако, похоже, вам нужна более сложная структура классов.

  • Представлено является проектом
  • Утверждена является Представлено
  • Отклонено является Представлено
  • Завершена является Утвержден

Таким образом, вы получите больше как глубокое дерево, чем все эти реализующего некоторый интерфейс документа.

Подумайте о том, хотите ли вы этого, потому что вложенные классы более 3 уровней - это боль для работы. Решением может быть создание только двух или трех реальных типов и сохранение некоторых состояний в поле свойств. Тогда проект будет иметь свойство Rejected или Status.

Альтернативой является использование декоратора. То есть, если документ одобрен, вы создаете новое Утвержденное и передаете проект конструктору. Таким образом, вы не получите глубокое наследование, и вы все еще можете получить информацию из проекта.

0

Насколько я понял, ваша проблема заключается в передаче различной информации между классами?

Вы можете сгруппировать всю эту информацию в структуру или класс и перенести ее как инструмент абстрактного метода запроса. , поэтому каждый производный класс (черновик, отправленный, одобренный) может получить необходимую информацию из этой структуры или установить ее. Moveover вы можете объединить эту информацию так:

struct Info{ 
public string Status; // may be aproved reqested or so. 
public string Comment; // just a comment depending on state 
//public string RejectedBy; 
//public string RejectedComment; no need it 
public Mission Mission; //extra info 

}

Смежные вопросы