Государственный Образец с Памятью - PullRequest
4 голосов
/ 13 января 2010

Я использовал State Pattern в обычном автомате. Я хотел иметь возможность перейти от [ A -> B ], [ B -> C ] и [ A -> C ]. Теперь у нашего домена есть новое правило, теперь мне нужно перейти от [C -> A] также, но только , если я никогда не был в B до . Итак, у нас есть состояний с памятью . Есть два возможных решения:

  1. Создать новое состояние CB , что означает C после B , и иметь эти правила [ A -> B ], [ B -> CB ], [ A -> C ], [ C -> A ]
  2. Используйте тот факт, что у нашего контекста есть список с предыдущими состояниями (давайте назовем его StateHistoric) и датой, когда были сделаны переходы (история состояний также является требованием домена нашего клиента), а затем используйте эти правила [ A -> B ], [ B -> C ], [ A -> C ], [ C -> A , если B НЕ в Context.StateHistoric].

Какой из этих двух способов является более правильным способом использования памяти для шаблона состояния? (или другая альтернатива этим 2)

Спасибо

Ответы [ 5 ]

3 голосов
/ 13 января 2010

перейти ко второму решению. Это легче понять и легче расширить.

Не утруждайте себя следствием шаблона проектирования только потому, что его название звучит похоже на то, что вам нравится делать.

2 голосов
/ 13 января 2010

Если у него есть память, значит, это не настоящий конечный автомат. Вариант 1 является правильным, если вы хотите сохранить эту идентичность.

1 голос
/ 16 января 2010

Конечные автоматы с памятью существуют, они называются автоматами ... Идея состоит в том, чтобы иметь стек, который вы можете прочитать, входя в состояние, и написать выход из состояния. Что касается состояния шаблона проектирования, я думаю, что он может быть реализован как Memento в контексте.

0 голосов
/ 20 марта 2012

Реализация шаблона состояния вместе с вариацией шаблона Memento ?

0 голосов
/ 14 января 2010

Вариант № 2 работает. Насколько велик ваш список истории? Если поиск по списку становится длительным процессом, то я бы выбрал вариант № 3: добавьте логический флаг в свой контекст, который называется что-то вроде visitStateB. Установите этот флаг в false при инициализации. Установите флажок true, когда переход переходит в состояние B.

...