这是处理Java事件的好方法吗?

时间:2010-10-10 00:28:46

标签: java model-view-controller events

我正在用Java制作一个游戏,我想我对如何处理事件非常了解。听起来不错吗?

一个Window类 - 视图。它是当前世界的代表。 还有一个Game类 - 控制器。 (该模型的实现与此问题无关)。

Window类不关心事件。因此,事件监听器只需将它们分派到Game类(通过game.notifyEvent(Event e);之类的东西。

Game类在收到此事件后,将开始更新值等,并且将更改某些变量(如播放器的位置)。此时,它使用其类变量Window w来通知 it 更改(通过w.movePlayer(Position p)等各种方法。

那么,这听起来像是对你有用的东西吗?

2 个答案:

答案 0 :(得分:2)

是的,你正在做的事情是有道理的。我觉得让窗口听游戏要比其他方式更直观。我还发现,如果你将GUI的不同区域分开并通过细粒度的界面将游戏传递给每个区域,那么Java就更易于维护。我通常会获取GUI元素来监听模型中的更改,并请求处理任何交互。通过这种方式可以更轻松地进行单元测试,如果您没有合适的自动化套件,甚至只是用于记录,您可以使用假的替代测试来替换GUI。

通常拆分GUI会导致某些面板纯粹倾听,而某些面板纯粹是相互作用的。这使得关注点分离得非常可爱。我用自己的类扩展JPanel代表面板,让Window在构建时将游戏传递给它们。

例如,如果我有两个面板,其中一个显示结果,另一个显示“更新”按钮,我可以定义两个界面:INotifyListenersOfResultsIPerformUpdates。 (请注意,我在这里使用IDoThisForYou模式制作基于角色的界面;您可以随意调用它们。)

游戏控制器然后实现这两个接口,并且两个面板各自采用相应的接口。 Update接口将有一个名为RequestUpdate的方法,而Results接口将具有AddResultsListener。这两种方法都出现在Game类中。

无论你是否让游戏听到窗口或游戏的窗口,通过这种方式通过界面分离事物,一旦事情开始变得更容易分割游戏控制器并委托其职责真的复杂,他们总是这样做!

答案 1 :(得分:0)

我认为您应该在不使用.NET事件的情况下实现Observer设计模式(http://en.wikipedia.org/wiki/Observer_pattern)。在我的方法中,您需要定义几个接口并添加一些代码。对于每种不同类型的事件,创建一对对称接口

public interface IEventXDispatcher
{
    void Register(IEventXHandler handler);

    void Unregister(IEventXHandler handler) throws NotSupportedException;
}

public interface IEventXHandler
{
    void Handle(Object sender, Object args);
}

X表示事件的特定名称(Click,KeyPress,EndApplication,WhateverYouWant)。 然后让你的观察类实现IEventDispatcher,你的观察者类实现IEventHandler

public class Dispatcher implements IEventXDispatcher, IEventYDispatcher ...
{
    private List<IEventXHandler> _XHandlers;
    private List<IEventYHandler> _YHandlers;

    void Register(IEventXHandler handler)
    {
        _XHandlers.Add(handler);
    }

    void Unregister(IEventHandler handler) throws NotSupportedException
    {
        //Simplified code
        _XHandlers.Remove(handler);
    }

    private MyMethod()
    {
        [...]
        for(IEventXHandler handler: _XHandlers)
            handler.Handle(this, new AnyNeededClass())
        [...]
    }
    //Same for event Y

所有代码都是手写的。我对Java几乎没有经验,但我相信这种模式可能对你有帮助!