Java 模块化编程

Posted

技术标签:

【中文标题】Java 模块化编程【英文标题】:Java modular programing 【发布时间】:2015-11-02 23:09:15 【问题描述】:

我是 Java 和这个网站的新手。

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

问题是我无法让 GUI 对象(actionPreformed 例程所在的位置)触发 GameEngine 类中的方法。我正在尝试在界面中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不要使它们相互依赖)。

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

例如,NewGame 按钮生成一个 NewGameCode。但是如何使用该代码和在界面中触发 GameEngine 中的 NewGame 方法?

【问题讨论】:

请发布您的课程/界面 作为一般规则,在使用之前不要尝试编写框架。当然,你的游戏引擎最好不要依赖于 UI,而是从直接从 UI 调用引擎的代码开始,如果它变得太复杂,那么你可以将其抽象出来。 欢迎来到 ***!请务必阅读我们的How to Ask 页面,以帮助您提出一个很好的问题。如果您对自己的问题付出一些努力,您更有可能从社区中得到一个好的答案。 建开发复杂程序的更实用的方法。 您说您无法访问 GUI 对象...为什么不呢?你可以用 GUI 做什么?你可以附加actionListeners吗?如果是,您可以运行接口 (=controller),一方面将实例化引擎,另一方面运行 GUI,对所需的 actionListener 进行编程。 【参考方案1】:

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

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 .

附:对不起我的英语不好。

【讨论】:

感谢您的回答。我在我的项目上使用你的代码

以上是关于Java 模块化编程的主要内容,如果未能解决你的问题,请参考以下文章

学 Java8 函数式编程

C++中的模块编程

模块化编程之CommonJS和AMD风格

java并发编程实战学习--基础构建模块

Javascript模块化编程:模块的写法

学习Java最重要的是哪些知识点?