我是Java和这个网站的新手。
我正在尝试开发一个尽可能模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们是完全独立的。另一个类是两者的接口。
问题是我无法让图形用户界面对象( actionPreformed例程所在的位置)触发GameEngine类中的方法。我正在尝试在接口中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不使它们相互依赖)。
我的想法是让actionPerformed返回一个代码,该代码在指导下一个操作的接口中处理。
例如,NewGame按钮生成一个NewGameCode。但是,如何在GameEngine中使用该代码并在接口中触发NewGame方法呢?
发布于 2015-08-11 06:20:45
使用一些编程模式,比如委托
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对象(如按钮)也有它们的操作侦听器。当图形用户界面实例化一个按钮时,它将自己设置为按钮的动作侦听器,因此,按钮的动作执行被委托给图形用户界面,当图形用户界面不知道如何执行指定的动作时,它将工作委托给自己的委托,因此,委托给GameEngine。
另外,很抱歉我的英语不好。
https://stackoverflow.com/questions/31929676
复制相似问题