2011-01-14 3 views
2

Каков ближайший шаблон дизайна для чего-то вроде трекера?Дизайн-шаблон для отслеживания/статусов

У вас есть объект, который может быть одного из различных статусов: open, closed, in production.

Действия могут быть выполнены в зависимости от текущего состояния.

Мое начальное моделирование выглядит немного как это:

class Status 
    - next_status (None or Status) 
    - previous_status (None or Status) 
    - actions (set of Actions) 

class Action 
    - name (string) 
    - description (string) 

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

Просто искал информацию о том, какой шаблон это больше всего подходит, поэтому я могу исследовать его еще немного. Благодаря!

ответ

3

Вы представляете finite state machine (FSM), на самом деле блок-схему, но ваш класс дизайн выглядит как doubly-linked list. Если Status определяет предыдущее и следующее состояние, это работает, но в большинстве систем это неверно. Рассмотрим статус «открытого» в вашем примере, возможно ли, что следующий может быть «закрытым» или «в производстве»?

Если оба Статусы есть возможности рассмотреть вопрос об изменении объекта состояния и добавлении перехода (или, возможно, заменить действия?) Объект вашей иерархии классов:

class Status 
    - transitions (Transition[]) 

class Transition 
    - from (Status) 
    - to (Status) 

Здесь Статус знает о том, что возможны переходы (например, «открыто «может перейти к« закрытому »или« в производстве »). Таким образом, вы представляете FSM как directed graph. Кроме того, по собственному опыту, как правило, не важно, чтобы сущность знала, откуда она появилась, из-за удаления prior_status. Вместо этого путь может быть захвачен посредством записи журнала аудита/таблицы базы данных.

+0

Это похоже на то, что я хочу. Я уже регистрирую переходы, и это дает мне правильное представление о том, как это сделать. Благодаря! –

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