Методы перехода в государственной схеме проектирования - PullRequest
5 голосов
/ 10 июня 2010

У меня есть конечный автомат со многими состояниями A--B--C--D--E.У меня есть много переходов от C, например, к A, если какое-либо условие проверено.Для каждого состояния у меня есть класс, расширяющий абстрактный класс State, и у меня есть менеджер, который делегирует каждый метод перехода в метод состояния.Вопрос в том, «могли ли государства вызывать методы непосредственного управления менеджером?».Я видел в Интернете только примеры, в которых есть основной класс, который точно знает, сколько раз происходит переход (т. Е. insertQuarter(), ejectQuarter(), turnCrank(), dispense()).Единственный способ сделать это - вызвать методы перехода менеджера в состояниях.Это неправильно или плохая практика?

Заранее спасибо Тобия

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Если вам нужен простой синхронный конечный автомат, в котором не более одного выполнения происходит в любой данный момент времени, я думаю о следующей модели:

1) Контекст выполнения представлен объектом Context. Контекст передается между состояниями и используется менеджером для принятия решения о потоке. API контекста зависит от того, насколько универсальной должна быть система.

2) Интерфейс состояния содержит метод execute (Context), в котором имеет место определенная логика. Разрешено использовать и изменять данные контекста.

3) Менеджер настроен с правилами перехода. Он может определить следующее состояние для выполнения, учитывая последнее состояние и контекст. Он начинается с выполнения начального состояния. После каждого выполнения состояния S он проверяет объект контекста на соответствие правилам перехода, связанным с состоянием S. Когда он достигает состояния терминала, поток завершается.

При таком дизайне реализации состояний никоим образом не знают о диспетчере и не участвуют в принятии решений о маршрутизации.

0 голосов
/ 10 июня 2010

Да ... По крайней мере, если я правильно понял ваш вопрос. Менеджер должен сохранять ссылку на текущее состояние, поэтому текущее состояние должно быть в состоянии попросить менеджера перейти в следующее текущее состояние. Посмотрите на пример Wikipedia для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...