首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态模式在状态对象高效和可扩展实现之间共享公共知识。

状态模式在状态对象高效和可扩展实现之间共享公共知识。
EN

Stack Overflow用户
提问于 2016-01-26 08:44:27
回答 1查看 2.5K关注 0票数 5

我正在使用状态模式,但我发现的示例是为了教育目的,我想知道这种模式中用于在状态()之间共享对象()的最佳实践是什么,即一个布尔值、一个列表以及一个状态对象的,以更改自动机对象中的状态引用。

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

代码语言:javascript
复制
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中存储obj1并使用getter和setter。用于自动机中的邮政存储状态,并使用getter和setter。通过使用getter,这种方法将使代码变得不必要的长,并且随着obj1和状态列表的改变而变得难以维护。
  2. 使用私有内部类。将State, State1State2声明为私有内部类,并直接访问obj1和states。由于文件的长度很难维护和更新。不能与其他Automata类共享。
  3. 把田地公之于众。我不想公开所有这些字段。
  4. 使用单例/静态类方法共享obj1

我不太了解包的私密性。

在我的设计中,我将此模式与模板方法模式作为附带信息结合在一起。

我知道不存在一刀切的方法,但是在使用这种模式时最常见的最佳实践是什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-26 09:25:59

我会这样做:

代码语言:javascript
复制
public class Automata {
  List<String> someList;
  boolean someBoolean;
  private State currentState;

  public void performAction() {
    currentState = currentState.action(this);
  }

  interface State {
    State action(Automata context);
  }

  enum States implements State {
    IDLE {
      @Override
      public State action(Automata context) {
        if (context.someBoolean) {
          return WORKING;
        }
        return this;
      }
    },
    WORKING {
      @Override
      public State action(Automata context) {
        if (context.someList.size() > 7) {
          return IDLE;
        }
        return this;
      }
    }
  }
}

状态的设置现在在performAction() of Automata中完成,无需在每个状态中执行。我使用enum作为状态的实现,因为当您想要将状态实现为纯函数时,它们是很棒的。但是,如果您的状态本身并不是无状态的,您可能希望将这些状态实现为静态内部类。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35009839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档