Из ваших примеров две модели выглядят очень похожими.Но ваш пример шаблона проектирования State на самом деле не является шаблоном проектирования State, поскольку вы устанавливаете состояние извне.Типичный шаблон проектирования состояний внутренне изменяет состояние и очень часто делегирует изменение самому состоянию.Давайте посмотрим на простую кнопку переключения.У него есть состояние, метод для его нажатия и метод для описания текущего состояния (toString()
):
class ToggleButton {
enum State {
ON {
public State press() {
return OFF;
}
},
OFF {
public State press() {
return ON;
}
};
abstract public State press();
}
State state = State.OFF;
public void press() {
state = state.press();
}
public String toString() {
return "Device is " + state;
}
}
Итак, вы не устанавливаете состояние извне, поэтому вы не знаетекакое это состояние и как оно будет реагировать.Вы используете:
button.press();
System.out.println(button);
Таким образом, ключевое отличие состоит в том, что для стратегии вы передаете стратегию извне и позволяете вашему объекту выполнить некоторую операцию (которая не меняет стратегию), так что это липкое делегирование.
Но цель паттерна проектирования State состоит в том, что предполагается, что состояние изменяется очень часто внутренне, а с изменением состояния меняется и поведение.Таким образом, даже если мы устанавливаем какое-либо состояние перед вычислением какой-либо задачи, оно может измениться (как правило, меняется) во время выполнения задачи, чтобы выполнить его.Это способ достижения государственного полиморфизма.Также обратите внимание, что это часто связано с государственными автоматами.