【问题标题】:state design pattern from Java to Ruby从 Java 到 Ruby 的状态设计模式
【发布时间】:2009-09-27 15:04:12
【问题描述】:

我有一个使用经典状态设计模式的 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);
}

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

    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 中。我知道类型检查方面的差异,以及模块和 mixin 在 Ruby 中与 Java 接口相比应该如何工作。

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

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

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

【问题讨论】:

    标签: java ruby oop design-patterns state-pattern


    【解决方案1】:

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

    我仍在思考 Java 内部 盒子,想知道我是否应该拥有我的 每个状态的具体实现 在不同的 .rb 文件中,然后 在客户端类中需要它吗?

    听起来不错,是的。

    【讨论】:

    • 感谢您的有用建议。所以看起来我也可以不用 ruby​​ 委托类。
    【解决方案2】:

    您想将特定程序从 Java 移植到 Ruby,还是想学习编写 Ruby?

    如果 #1,为什么?

    如果是#2,我建议您使用现有的 Ruby 代码来学习 Ruby 风格。为此,我强烈推荐 Ruby on Rails,因为它是一个编写良好的框架。 我从 Rails 中学到了很多东西,即使我用其他语言编写其他类型的程序时也可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多