无状态模式国家的不理解模式
public static void main(String[] args) {
Context c = new Context();
for (int i = 0; i < 10; i++)
c.someMethod();
}
static class Context {
public static final int STATE_A = 0;
public static final int STATE_B = 1;
private int state = STATE_A;
public void someMethod() {
switch (state) {
case STATE_A:
System.out.println("StateA.SomeMethod");
state = STATE_B;
break;
case STATE_B:
System.out.println("StateB.SomeMethod");
state = STATE_A;
break;
default:
break;
}
}
}
状态模式
public static void main(String[] args) {
Context context = new Context();
context.setState(new State1());
for (int i = 0; i < 10; i++)
context.someMethod();
}
static class Context {
State state;
void setState(State state) {
this.state = state;
}
void someMethod() {
state.someMethod();
if (state instanceof State1) {
state = new State2();
} else {
state = new State1();
}
}
}
static interface State {
void someMethod();
}
static class State1 implements State {
@Override
public void someMethod() {
System.out.println("StateA.SomeMethod");
}
}
static class State2 implements State {
@Override
public void someMethod() {
System.out.println("StateB.SomeMethod");
}
}
在第一种情况下,我们只有一个目标,但在另一个我们每次创建新的对象时,我们称之为someMethod()
方法。
- 这是对模式的正确理解吗?
- 我该如何解决这个问题,不创造这么多的对象?
- 我还需要了解这种模式吗?
你的第一个例子只有两个状态。在一个更大的例子中,'someMethod()'会变得非常笨拙。不要过于担心创建小型,短暂的物体。垃圾收集器处理得很好。如果对象创建确实成为问题,那么只需在Map或List中保存每个状态类的实例,或者(ab)为此目的使用'enum'。 – Barend 2012-02-06 19:55:20
感谢您的回复。 – drifter 2012-02-06 19:59:31