Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在Java中处理事件的好方法吗?_Java_Model View Controller_Events - Fatal编程技术网

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

这是在Java中处理事件的好方法吗?,java,model-view-controller,events,Java,Model View Controller,Events,我正在用Java制作一个游戏,我想我对如何处理事件有很好的了解。这听起来对吗 一个窗口类--视图。它代表了当前的世界。 还有一个游戏类——控制器。(模型的实现与此问题无关) 窗口类不关心事件。因此,事件侦听器只需将它们发送到Game类(通过类似Game.notifyEvent(event e);) 收到此事件后,游戏类将开始更新值等,一些变量(如玩家的位置)将被更改。此时,它使用其类变量窗口w通知更改(通过各种方法,如w.movePlayer(位置p)等) 那么,这听起来对您有意义吗?我认为您应

我正在用Java制作一个游戏,我想我对如何处理事件有很好的了解。这听起来对吗

一个
窗口
类--视图。它代表了当前的世界。 还有一个
游戏
类——控制器。(模型的实现与此问题无关)

窗口类不关心事件。因此,事件侦听器只需将它们发送到
Game
类(通过类似
Game.notifyEvent(event e);

收到此事件后,游戏类将开始更新值等,一些变量(如玩家的位置)将被更改。此时,它使用其类变量
窗口w
通知更改(通过各种方法,如
w.movePlayer(位置p)
等)


那么,这听起来对您有意义吗?

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

public interface IEventXDispatcher
{
    void Register(IEventXHandler handler);

    void Unregister(IEventXHandler handler) throws NotSupportedException;
}

public interface IEventXHandler
{
    void Handle(Object sender, Object args);
}
X表示事件的特定名称(单击、按键、结束应用程序、任何您想要的)。 然后让您的观察者类实现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
公共类调度程序实现IEventXDispatcher、IEventYDispatcher。。。
{
私人名单管理者;
私人名单(处理人);;
无效寄存器(IEventXHandler处理器)
{
_添加(handler);
}
void Unregister(IEventHandler)抛出NotSupportedException
{
//简化代码
_移除(处理器);
}
私有MyMethod()
{
[...]
对于(IEventXHandler处理器:xHandler)
Handle.Handle(这是新的AnyNeededClass())
[...]
}
//事件Y也一样

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

是的,你所做的有些道理。我发现让窗口听游戏比让窗口听游戏更直观。我还发现,如果你把游戏的不同区域分开,Java的可维护性会更好GUI,并通过细粒度的界面将游戏传递给每一个用户。我通常让GUI元素监听模型中的更改,并请求处理任何交互。这种方式使单元测试更容易,如果没有合适的自动化套件,甚至可以用假GUI代替GUI进行验收测试只是为了记录

通常,拆分GUI会导致一些面板纯粹是监听的,而一些面板纯粹是交互的。这使得关注点的分离非常可爱。我用扩展
JPanel
的类来表示面板,并让窗口在构建时将游戏传递给它们

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

然后游戏控制器实现这两个接口,两个面板分别采用各自的接口。更新接口将有一个名为
RequestUpdate
的方法,结果接口将有
AddResultsListener
。然后这两个方法都出现在游戏类中


无论您是让游戏听窗口还是让窗口听游戏,通过这种方式通过界面分离东西,您可以更容易地在事情开始变得非常复杂时分离游戏控制器并委派其职责,他们总是这样做!

MVC基于观察者设计pat无论如何,这就是
game.notifyEvent(…)
正在做的。所以在我调用
game.pushEvent(e)
之后,我应该调用
ChangeObject changes=game.getChanges()
还是什么?创建一个只用于信息传递的类似乎很奇怪。我通常只创建一个小接口,而不是创建一个ChangeObject类,然后将该接口直接放在游戏上。如果太复杂,您可以稍后拆分另一个类,并使用依赖项注入将其传递给游戏和窗口。