Вы очень близки. Метод changeState
принадлежит к классу Context
, а не к классу State
. Вот хорошая статья по топи c. Обратите внимание, что диаграмма классов показывает changeState
в классе Document
(контекст).
Чтобы сделать его еще чище, changeState
может принимать состояние next
в качестве параметра. Примерно так:
class Context {
State state;
void method1() {
state.method1();
}
void changeState(next) {
state.exit();
this.state = next;
state.enter();
}
}
abstract class State {
Context context;
// other methods
}
class ConcreteState extends State {
void method1() {
// do something
context.changeState(AnotherConcreteState);
}
void enter() { /* do something */ }
void exit() { /* do something */ }
}
Теперь, когда вы добавляете больше методов в Context
, дублирования в Context
не происходит. Это выглядело бы так:
class Context {
State state;
void method1() {
state.method1();
}
void method2() {
state.method2();
}
void changeState(next) {
state.exit();
this.state = next;
state.enter();
}
}
abstract class State {
Context context;
// other methods
}
class ConcreteState extends State {
void method1() {
// do something
context.changeState(AnotherConcreteState);
}
void method2() {
// do something else
context.changeState(YetAnotherConcreteState);
}
void enter() { /* do something */ }
void exit() { /* do something */ }
}