В этом параграфе в основном говорится, что вы кодируете свои состояния как отдельные классы - тогда тип экземпляра - это «состояние», и классам не нужны переменные экземпляра, потому что их тип кодирует всю необходимую вам информацию.
Например, я хочу иметь три состояния: «Открыто», «Активно» и «Закрыто».Я мог бы определить следующие классы:
abstract class State {};
class Open extends State {
public Open() {}
}
class Active extends State {
public Active() {}
}
class Closed extends State {
public Closed() {}
}
-
Другой вариант - я подозреваю, что это комбинация с навесным весом, на который намекают в тексте GOF, будет создание состояниякласс, который представляет собой набор статических членов (по одному для каждого состояния), которые затем могут быть разделены -
public class State {
private string name;
private State(String name) {
this.name = name;
}
public final static State OPEN = new State("Open");
public final static State ACTIVE = new State("Active");
public final static State CLOSED = new State("Closed");
}
Мне пришлось копать, чтобы напомнить себе, как все это работает в деталях.У Кериевского есть хорошее описание этого (я сильно позаимствовал из одного из его примеров выше!) И того, как переходы состояний могут обрабатываться путем подклассов из класса состояний, чтобы создавать классы, которые управляют каждым переходом.См. «Рефакторинг к шаблонам» (ISBN: 0321213351)
РЕДАКТИРОВАТЬ (2): На его веб-сайте приведена диаграмма классов для его примера - http://www.industriallogic.com/xp/refactoring/alteringConditionalsWithState.html