java - 从 Java 到 Ruby 的状态设计模式

标签 java ruby oop design-patterns state-pattern

我在java中有一个工作解决方案,使用经典的状态设计模式,但在将其转换为ruby时遇到一些困难。我是 Ruby 新手,但我认为困难在于如何在动态语言中实现模式的差异。

我的界面描述了模型在每种状态下可以执行的操作:

public interface State {

    public void doTask1(Model a_model);
    public void doTask2(Model a_model);
    public boolean doTask3(Model a_model, Helper a_helper);
}

接下来,我实现状态接口(interface)并创建逻辑的具体状态:

    public class LogicState1 implements State {

 public void doTask1(Model a_model) {
  a_model.implementTask1();
 }

 public void doTask2(Model a_model) {
  a_model.implementTask2();
 }

 public boolean doTask3(Model a_model, Helper a_helper) {
                a_model.useHelper();
      return a_model.setState(a_model.getALogicstate(a_key));
}

正如您所看到的,每个具体状态都可以进入模型并更改其状态。为了避免封装问题,我在 Model 类中实例化了具体状态,该类还引用了当前状态:

public class Model {

private State currentState;

public void setState(State state){
 this.currentState = state;
 }

public State getState(){
 return currentState;
 }

private final Map<String, State> everyState = new HashMap<String, State>();

public Model(String initialStateKey){
   everyState.put("key1", new LogicState1());
   everyState.put("key2", new LogicState2());
   //...etc, instantiate and store all business logic states
   this.currentState = everyState.get(initialStateKey);
}

public State getALogicState(String key){
 return everyState.get(key);
}
public void useHelper(){...}

客户会像这样使用模型:

public void run(Model a_model) {
 a_model.getState().doTask1(a_model);
}

我认为上述所有 Java 都很简单,但现在我正在尝试将此设计移植到 Ruby 中。我知道类型检查方面的差异,以及模块和混入在 Ruby 中与 Java 接口(interface)相比应该如何工作。

我还在 pickaxe 中找到了有关 Ruby 中的状态设计模式的信息。书。 现在我有点困惑哪种是尝试这种转换的最佳方法。我仍在 Java 框内思考,想知道是否应该在不同的 .rb 文件中具体实现每个状态,然后在客户端类中需要它?

有没有办法在不使用 delegate.rb 库的情况下实现上述内容?

任何关于如何开始我的转换的建议都将受到热烈欢迎。

最佳答案

要将其转换为 ruby​​,您可以省略界面并保持其他所有内容不变。 IE。每个状态都是一个定义方法 do_task_N 的类,并且没有与其他状态类的连接(这意味着您不必通过混合模块来“模拟”通用接口(interface)或任何东西,你根本不需要它)。

I am still thinking inside the Java box, and wondering if I should have my concrete implementation of each state in a different .rb file and then require it in the client class?

听起来不错,是的。

关于java - 从 Java 到 Ruby 的状态设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1483749/

相关文章:

c++ - 使用 Valgrind 调试程序 - 检测段错误

php - 与 OOP 概念斗争

java - 将 AdapterView 与抽屉导航结合起来

java - 改变落球速度...处理中

ruby-on-rails - Rails 国际化 : Setting the Locale from the Domain Name

ruby - 为什么我不能将函数参数压入数组?

ruby-on-rails - Ruby On Rails 4 会默认将 config.active_record.whitelist 属性设置为 true 吗?

java - 如何排序 List<List<String>>

java - 在任何文本字段上按下 Enter 键时的操作

java - 如何确保在所有子类中都使用一个变量?