5

我想创建一个可以在本地和在线上运行的游戏。

我的第一个想法是创建一个接口,该接口将包含 GUI 业务逻辑所需的所有方法,然后具有网络实现和本地实现。

这适用于请求-响应消息。但是服务器发送的消息呢,我必须更新一些 GUI 组件(即 JLabels)?

我的第一个解决方案是实现监听器,实现中的每个更改都会触发一个事件。GUI 将适当地注册和更改其组件。但是,在业务逻辑中调用触发事件看起来有点不对劲。

我在正确的轨道上吗?因为我觉得我不是。有什么建议么?

谢谢你。

注意:客户端是一个简单的 Java Swing GUI。

4

2 回答 2

6

您所描述的将有助于保持模型独立于演示问题的目标,这是一件好事。这也将在模型的设计、开发和维护期间为您提供帮助,因为您可以在模型中的某些更改应该触发特定事件的基础上编写单元测试,而不必担心屏幕上可能会是什么样子。

而且,当然,它使您可以为不同的环境使用不同的 GUI 设计。

关键是事件应该是关于模型状态的变化,而不是关于表示级别的预期动作/表示。让表示层处理是否/如何响应模型事件。

于 2008-12-27T16:18:03.837 回答
1

我承认我从事 Web 开发,所以我对 Swing 没有太多经验。

但我一直认为我的处理方式是将应用程序分解为 /view、/model 和 /controller 包。这些关系将是单向的:/controller 将知道 /model 和 /view,但两者都不会从 /controller 或彼此导入任何类。

/view 层组件永远不会是 JFrame;它们总是 JPanel 或其他可以根据需要组合成 JFrame 的合适容器。每个都会引用 Listener 接口,在构造函数中初始化,并且会遵循这些接口进行事件处理:

public class ExamplePanel extends JPanel implements ActionListener
{
    private JButton button;
    private ActionListener buttonListener;

    public ExamplePanel(ActionListener buttonListener)
    {    
        this.button = new JButton("Do Something");
        this.buttonListener = buttonListener;
        this.button.addListener(this.buttonListener);
    }

    public void actionPerformed(ActionEvent e)
    {
        this.buttonListener.actionPerformed(e);
    }
}

这种安排与依赖注入配合得很好,因为现在控制器可以选择使用该侦听器接口的本地或远程实现,以完全不影响客户端的方式更改行为。

我承认我从来没有一直遵循它。

Spring 的人有一个丰富的 Swing 客户端模块,但它似乎已经失宠了。看起来他们已经决定 BlazeDS 方向是富客户的更好选择。但也许你可以从他们的方法中收集到一些设计理念。

于 2008-12-27T17:21:08.280 回答