State Pattern分享状态对象高效和可执行实现之间的常识

时间:2016-01-26 08:44:28

标签: java design-patterns state

我正在使用状态模式,但我发现的示例仅用于教育目的,我想知道这种模式中在状态之间共享对象的最佳实践,即布尔值,列表还有用于一个状态对象来更改自动机对象中的状态引用

我将制作一个简单的模型作为例子。

public abstract class State {

    Automata automata;

    public State( Automata automata){
         this.automata = automata;
    }

    public abstract void action();

}

public class State1 extends State {

    public State1(Automata automata){
         super(automata)
    }

    @Override
    public void action() {
        // GET  : Use obj1 
        // POST :Set in automata state to State2 
    }
} 

public class State2 extends State {

     public State2(Automata automata){
         super(automata)
    }

    @Override
    public void action() {
        // GET  :Use obj1 
        // POST :Set in automata state to State1 
    }
}  

public class Automata {

     private State state1 = new State1(this);
     private State state2 = new State2(this);
     private State state = state1;

     public void takeAction() {
         state.action()
     }
}

我尝试了以下解决方案:

  1. 在Automata中 GET 存储obj1并使用getter和setter。对于 POST 在Automata中存储状态并使用getter和setter。这种方法会通过使用getter使代码不必要地变长,并且变得很难通过更改obj1和状态列表来维护。
  2. 使用私有内部类。将State, State1State2声明为私有内部类,并直接访问obj1和状态。由于文件长度很难维护和更新。无法与其他Automata类共享。
  3. 公开字段。我不想公开所有这些字段。
  4. 使用单例/静态类方法共享obj1
  5. 我找不到包私有访问。

    在我的设计中,我将此模式与模板方法模式结合起来作为辅助信息。

    我知道一刀切方法不存在,但使用此模式的常见最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

关注@rinde帖子后,我很好奇这是否是可接受的解决方案

public abstract class State {

    public State(){
    }

    public abstract void action(sharedState);

    public class SharedState{
         Obj1 obj1;
         State state1;
         State state2;
         State curState;

         //Getters and setters
    }
}

public class State1 extends State {

    @Override
    public void action(SharedState sharedState) {
        // GET  : Use obj1 
        sharedState.obj1.doSomething()
        // POST :Set in automata state to State2 
        sharedState.curState = sharedState.state2;
    }
} 

//..same for State2

public class Automata {

   State.SharedState sharedState;

   public Automata(){
        sharedState.setState1(new State1());
        sharedState.setState2(new State2());
   }


   public void takeAction() {
       sharedState.getCurrentState().action(sharedState);
   }
}