Java 课堂设计

Java 课堂设计,java,coupling,cohesion,Java,Coupling,Cohesion,我为我正在制作的游戏上了2节课 gui类和逻辑类,用于零和交叉的游戏。GUI类有一个方法,该方法使用JButton数组,并使用相同的匿名内部类操作侦听器返回所有JButton 问题是,当我点击按钮时,我希望文本变为x或o,取决于播放器1或2 go,但此代码应该在逻辑类中,而不是它,因此我应该在逻辑类中创建一个方法,并从make button方法的另一个内部类动作侦听器调用它。但是,逻辑类不应该有对gui的引用,因为gui有对逻辑类的引用 我想不出一个像样的解决办法 谢谢也许可以使用事件。因此,您

我为我正在制作的游戏上了2节课

gui类和逻辑类,用于零和交叉的游戏。GUI类有一个方法,该方法使用JButton数组,并使用相同的匿名内部类操作侦听器返回所有JButton

问题是,当我点击按钮时,我希望文本变为x或o,取决于播放器1或2 go,但此代码应该在逻辑类中,而不是它,因此我应该在逻辑类中创建一个方法,并从make button方法的另一个内部类动作侦听器调用它。但是,逻辑类不应该有对gui的引用,因为gui有对逻辑类的引用

我想不出一个像样的解决办法


谢谢

也许可以使用事件。因此,您可以在逻辑计算的GUI端做出反应,只需按照命令执行即可;)

使用同一实例作为多个按钮的动作侦听器几乎肯定是个坏主意。使用按钮位置参数化的同一实现类的单独实例。然后,侦听器可以使用适合模型的接口调用模型。

如果您的重点是设计(这听起来像是家庭作业),您可以尝试

在这种情况下,

model = game logic, rules (fire events when things change)
  gui = (in this case and many swing apps) is both view and controller. Manipulates the model (control) and the model fires events back to update the widgets (view)

我不认为双向引用(GUI有模型的引用,反之亦然)应该是一个问题。我认为您正在搜索的是MVC(模型-视图-控制器)方法。我不知道您正在使用哪种编程语言来编程该游戏,在这种情况下,是否应用这种方法可能是一种开销。 我已经用Java编写了一个MVC方法的小演示:


也许它可以帮助您,让我知道。

当按钮单击发生时,您的GUI调用逻辑以通知它当前播放器(logic knows current player)在某个地方单击了网格。然后,逻辑更新状态(更新网格、更新当前播放器等),并将事件发送回GUI,通知GUI必须更新自身


GUI“知道”调用操作的逻辑。为了避免逻辑不了解GUI并具有良好的关注点分离,应该通过观察者模式将逻辑耦合到GUI,而不是直接调用GUI的逻辑。GUI侦听来自逻辑的事件。然后,逻辑仅动态耦合到GUI,这不是问题。

考虑以下类的示意图:

public class Game{
    public void switchPlayer(){
        // among other things calls all GameListeners
    }
    public void setMarker(int x, int y);

    public Player getCurrentPlayer();
    public Player getPlayerOwningField(int x, int y);

    public void registerGameListener(GameListener l);
}

public interface GameListener(){
    void gameChanged(Game g)
}

public class GUI implements GameListener(){
    private Game game;
}
单击字段时,将调用game.setMarker(x,y)。游戏知道当前玩家是谁,因此可以适当地标记场地。它还将触发一个GameChanged事件。在应用程序的安装过程中,gui必须注册/注册为游戏的游戏监听器。因此,它也会得到通知。它使用游戏的getter来更新gui。完成了


当然,还有很大的改进空间,例如,在大型游戏中,仅仅因为一个字段发生了更改就更新整个UI不是一个好主意,但它应该让您开始

在数据库中保存事件标志或类似的内容,并在gui中查询该标志 像异步一样工作。事件

您可以应用该模式

UI类(控制器)将向逻辑类(模型)发送消息,逻辑类将更新视图(类)。你需要定义这个。它可以像布尔值数组一样简单

UI代码必须读取View类才能更改按钮中的文本。因此,当视图更改时,您需要向UI类发送一条“invalidate”消息,以便更新按钮文本


这里的关键点是UI代码参考视图对象来呈现按钮。UI类读取此对象和逻辑类编写此对象是完全正确的。

对不起,您是如何表示事件的,有没有更好的方法来解释这一点,或者可能将我链接到关于您的意思的教程?Sun事件文档:我不是java程序员,所以我没有代码可以作为示例发布。请在下次的D+中投入更多的精力。