【发布时间】: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