状态设计模式:使用 entry() 和 exit() 时如何避免代码重复?
State Design Pattern: How to avoid code duplication when using entry() and exit()?
情况:我的状态有一个 entry() 和 exit() 方法,每次状态转换时都需要调用它们。为确保这一点,我在 State 中使用了包含必要过程的 changeState() 方法。每次使用涉及状态机的操作时,上下文都会调用它。然而,问题是我每次添加新方法时都需要调用 state.changeState() 并且我确信有一种方法可以避免代码重复。下面是进一步说明的代码
class Context {
State state;
void method1() {
state.method1();
state.changeState();
}
void method2() {
state.method2();
state.changeState(); // Code duplication!!
}
abstract class State {
Context context;
State next;
void changeState() {
this.exit();
next.entry();
context.setState(next);
}
// other necessary methods
}
class ConcreteState extends State {
void method1() {
// do something
next = AnotherConcreteState;
}
void entry() {/*do something */};
void exit() {/*do something */};
}
如果我想在 Context 中添加额外的方法,如何避免每次在新方法中调用 state.changeState() 的代码重复?
你们很亲近。 changeState
方法属于 Context
class,而不属于 State
class。这里是 a good article on the topic。请注意,class 图在 Document
(上下文)class.
中显示 changeState
为了让它更简洁,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 */ }
}
情况:我的状态有一个 entry() 和 exit() 方法,每次状态转换时都需要调用它们。为确保这一点,我在 State 中使用了包含必要过程的 changeState() 方法。每次使用涉及状态机的操作时,上下文都会调用它。然而,问题是我每次添加新方法时都需要调用 state.changeState() 并且我确信有一种方法可以避免代码重复。下面是进一步说明的代码
class Context {
State state;
void method1() {
state.method1();
state.changeState();
}
void method2() {
state.method2();
state.changeState(); // Code duplication!!
}
abstract class State {
Context context;
State next;
void changeState() {
this.exit();
next.entry();
context.setState(next);
}
// other necessary methods
}
class ConcreteState extends State {
void method1() {
// do something
next = AnotherConcreteState;
}
void entry() {/*do something */};
void exit() {/*do something */};
}
如果我想在 Context 中添加额外的方法,如何避免每次在新方法中调用 state.changeState() 的代码重复?
你们很亲近。 changeState
方法属于 Context
class,而不属于 State
class。这里是 a good article on the topic。请注意,class 图在 Document
(上下文)class.
changeState
为了让它更简洁,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 */ }
}