状态模式:从字符串中识别状态类类型

时间:2015-06-06 10:47:46

标签: java design-patterns state

背景

我有一个使用状态模式的命令。当命令状态改变时,我在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());
   }
}

2 个答案:

答案 0 :(得分:1)

  1. 当您从外部检查对象的状态时,可以撤消状态模式,然后根据它的状态采取不同的行为。如果看起来更方便,那么状态可能就是错误的工具。

  2. 句子“具有状态的命令”引发红旗。这是一些不合理的状态和命令模式的混搭吗?

  3. 示例中存在一个可怕的错误:您使用标识而不是值来比较字符串。

  4. 通常,如果您对任何模式有任何疑问,请不要尝试使用它。它们是有毒的动物,从安全的距离更好地研究。

答案 1 :(得分:0)

此模式有时称为字符串类型强类型上的双关语)。

最好的方法是使用枚举。