Можно ли здесь реализовать шаблон State? - PullRequest
0 голосов
/ 22 июля 2010

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

Проект, Отправлено, Одобренный, Отклонено, InMission, Завершена

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

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

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

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

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

С уважением,

Мош

Ответы [ 2 ]

0 голосов
/ 22 июля 2010

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

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

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

}

0 голосов
/ 22 июля 2010

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

  • Представлен проект
  • Одобрено Отправлено
  • Отклонено - отправлено
  • Завершено - Одобрено

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

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

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

...