代码之家  ›  专栏  ›  技术社区  ›  Christian Mann

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

  •  2
  • Christian Mann  · 技术社区  · 15 年前

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

    窗口类不关心事件。因此,事件侦听器只需将它们分派给 上课(通过 game.notifyEvent(Event e); .

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Lunivore    15 年前

    是的,你所做的有些道理。我发现让窗口听游戏比让窗口听游戏更直观。我还发现,如果将GUI的不同区域分开,并通过细粒度接口将游戏传递给每个区域,Java的可维护性会更好。我通常让GUI元素监听模型中的更改,并请求处理任何交互。这样可以简化单元测试,如果您没有一个像样的自动化套件,甚至仅仅是用于日志记录,那么您可以用一个伪的验收测试替换GUI。

    通常拆分GUI会导致一些面板纯粹监听,而一些面板纯粹交互。这使得关注点的分离变得非常可爱。我用它们自己的类扩展来表示面板 JPanel

    例如,如果我有两个面板,其中一个显示结果,另一个有“更新”按钮,我可以定义两个界面: INotifyListenersOfResults IPerformUpdates . (请注意,我在这里使用 IDoThisForYou

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

    不管你是让游戏监听窗口还是游戏的窗口,通过这种方式通过界面分离东西,你可以更容易地在以后分割游戏控制器并委派其职责,一旦事情开始变得 真正地 很复杂,他们总是这样!

        2
  •  0
  •   usr-local-ΕΨΗΕΛΩΝ    15 年前

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

    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没有什么经验,但我相信这种模式可能会帮助您!