背景
我有一个使用状态模式的命令。当命令状态改变时,我在UI中被通知,例如class stageOneState现在是活动状态。使用字符串作为标识符来检查状态类类型是不好的做法吗?这是否会破坏状态模式的工作?
还有什么选择?
示例
if (notifiedState.type == "state1") {
// Update UI accroding to state1
} else ...
示例
来自http://www.tutorialspoint.com/design_pattern/state_pattern.htm
的示例public interface State {
public void doAction(Context context);
}
public class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
public String toString(){
return "Start State";
}
}
public class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
public String toString(){
return "Stop State";
}
}
public class Context {
private State state;
public Context(){
state = null;
}
public void setState(State state){
this.state = state;
}
public State getState(){
return state;
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
答案 0 :(得分:1)
当您从外部检查对象的状态时,可以撤消状态模式,然后根据它的状态采取不同的行为。如果看起来更方便,那么状态可能就是错误的工具。
句子“具有状态的命令”引发红旗。这是一些不合理的状态和命令模式的混搭吗?
示例中存在一个可怕的错误:您使用标识而不是值来比较字符串。
通常,如果您对任何模式有任何疑问,请不要尝试使用它。它们是有毒的动物,从安全的距离更好地研究。
答案 1 :(得分:0)
此模式有时称为字符串类型(强类型上的双关语)。
最好的方法是使用枚举。