В «классическом» шаблоне состояний ответственность за определение следующего состояния лежит на объекте текущего состояния. Для задач, где это возможно, шаблон состояний работает очень хорошо и создает чистый и понятный код.
Однако оно ломается, когда текущее состояние не может определить следующее состояние, но должно делегировать это решение вызывающей стороне. Если проблема достаточно велика, код вскоре станет непонятным, и лучше использовать UMLish-конечный автомат с переходами, действиями и средствами защиты, где изменения состояния могут управляться таблицами.