Java 模块化编程

3

我刚学Java并且第一次到这个网站。

我试图尽可能开发一个模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们完全独立。还有另一个类是两者的接口。

问题在于,我无法让GUI对象(其中包含actionPerformed例程)触发GameEngine类中的方法。我尝试在接口中完成所有编程,而不必修改任何其他两个类(或至少不使它们代码依赖)。

我的想法是让actionPerformed返回一个代码,在接口中处理该代码以指导下一步操作。

例如,NewGame按钮会生成NewGameCode。但如何使用该代码在接口中触发GameEngine中的NewGame方法?


1
请发布您的类/接口。 - GregH
一般来说,在使用框架之前不要试图编写它。当然,让您的游戏引擎不依赖于用户界面是个好主意,但是从直接从用户界面调用引擎的代码开始,如果变得太复杂,那么您可以将其抽象出来。 - biziclop
建议:1)查阅模型-视图-控制器设计模式,作为一种良好的分离关注点的方式;2)弹道原型编程,这个概念在Hunt和Thomas的《程序员修炼之道》中有很好的介绍,是一种更实用的开发复杂程序的方式。 - Hovercraft Full Of Eels
你说你无法访问GUI对象...为什么?GUI能做什么?你能附加actionListeners吗?如果可以,你可以运行接口(= 控制器),它将一方面实例化引擎,另一方面实例化GUI,并编写所需的actionListeners。 - Little Santi
感谢您的答案和链接。 - McMoss
显示剩余2条评论
1个回答

0

使用一些编程模式,例如委托

ActionListener.java:

interface ActionListener {

    public boolean performAction(Action action);

}

GUI.java:

class GUI implements ActionListener {
    protected ActionListener actionListener;

    public void setActionListener(ActionListener listener) {
        this.listener = listener;
    }

    public boolean performAction(Action action) {
      // GUI knows, how to handle specified action:
      if (action.is("toggle-gui")) {
         ...
         return true;
      }

      // else, should Engine try to perform that action?
      if (listener != null)
        if (listener.performAction(action))
          return true;

      // rare occasion
      return false;
    }

}

GameEngine.java:

class GameEngine implements ActionListener {

    public boolean performAction(Action action) {
      if (action.is("game-new")) {
         // start a new game here
         ...
         return true;
      }

      return false;
    }

}

SomeInitializationCode.java

void init() {
  ...

  engine = new GameEngine();
  gui = new GUI();

  gui.setActionListener(engine);

  ...
}

此外,正如您可能已经猜到的那样,GUI 对象(如按钮)也有它们的动作监听器。当 GUI 实例化一个按钮时,它会将自己设置为按钮的动作监听器,因此,按钮的动作执行被委托给 GUI,当 GUI 不知道如何执行指定的动作时 - 它将工作委托给自己的代理,从而委托给 GameEngine。
P.S. 对不起,我的英语不太好。

谢谢你的回答。我正在我的项目中使用你的代码。 - McMoss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接