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 模块化编程的主要内容,如果未能解决你的问题,请参考以下文章