Java模块化编程
我是Java和这个网站的新手 我正在努力开发一款尽可能模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们是完全独立的。另一个类是两者的接口 问题是我无法让GUI对象(actionPreformed例程所在的位置)触发GameEngine类中的方法。我正在尝试在接口中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不使它们相互依赖) 我的想法是让actionPerformed返回一个代码,该代码在指导下一个操作的接口中处理Java模块化编程,java,user-interface,actionlistener,modular,Java,User Interface,Actionlistener,Modular,我是Java和这个网站的新手 我正在努力开发一款尽可能模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们是完全独立的。另一个类是两者的接口 问题是我无法让GUI对象(actionPreformed例程所在的位置)触发GameEngine类中的方法。我正在尝试在接口中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不使它们相互依赖) 我的想法是让actionPerformed返回一个代码,该代码在指导下一个操作的接口中处理 例如,NewGame按钮会生成一个新的游戏代码。
例如,NewGame按钮会生成一个新的游戏代码。但是,如何在游戏引擎中使用该代码并在界面中触发NewGame方法呢?使用一些编程模式,比如委派: 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
另外,很抱歉我英语不好。请发布您的类/接口。一般来说,在使用框架之前,不要尝试编写框架。当然,游戏引擎最好不要依赖于UI,而是从直接从UI调用引擎的代码开始,如果它变得太复杂,那么你可以将其抽象出来。欢迎使用StackOverflow!请务必阅读我们的页面,以帮助您制定一个伟大的问题。如果你对你的问题投入一些精力,你就更有可能从社区中得到一个好的答案。建议:1)将设计模式视为分离关注点的好方法;2)Hunt和Thomas的“实用程序员”中充分阐述了这一概念,作为一种开发复杂程序的更实用的方法。你说你不能访问GUI对象。。。为什么不呢?您可以用GUI做什么?你能附加actionListeners吗?如果是,您可以运行接口(=控制器),一方面将实例引擎,另一方面运行GUI,对所需的actionListeners进行编程。谢谢您的回答。我在项目中使用你的代码