2010-10-10 3 views
2

Я делаю игру на Java, и я думаю, что у меня есть хорошая идея о том, как обрабатывать события. Правильно ли это звучит?Является ли это хорошим способом обработки событий в Java?

A Window класс - вид. В настоящее время это представление Мира. Существует также класс Game - контроллер. (Реализация модели не имеет значения для этого вопроса).

Класс Window не заботится о событиях. Таким образом, слушатель событий просто отправляет их в Game класса (через что-то вроде game.notifyEvent(Event e);.

Класс игры, при получении этого события, начнется обновление значений и т.п., а также некоторые переменные (например, на месте игрока) будет изменен. на данный момент, она использует переменную класса Window w уведомить его изменений (с помощью различных методов, таких как w.movePlayer(Position p) и т.д.

SO, делает этот звук как-то, что будет иметь смысл для вас ?

ответ

2

Да, что вы делаете, имеет смысл. Я нахожу более интуитивным, чтобы Window слушал Игру, чем наоборот. Я также обнаружил, что Java гораздо удобнее обслуживать, если вы выделяете разные области графического интерфейса и передаете игру в каждый из них через мелкозернистый интерфейс. Я обычно получаю элементы GUI, чтобы слушать изменения в модели и запрашивать любые взаимодействия, с которыми нужно иметь дело. Этот способ упрощает модульное тестирование, и вы можете заменить GUI подделкой для приемочного тестирования, если у вас нет подходящего набора автоматизации или даже для ведения журнала.

Обычно расщепление результатов графического интерфейса на некоторых панелях чисто слуховое, а некоторые панели чисто взаимодействуют. Это создает действительно прекрасное разделение проблем. Я представляю панели с их собственными классами, расширяя JPanel, и пусть Окно передает им игру по строительству.

Так, например, если у меня есть две панели, одна из которых отображает результаты, а одна из которых имеет кнопку «Обновить», я могу определить два интерфейса: INotifyListenersOfResults и IPerformUpdates. (Обратите внимание, что я использую интерфейсы на основе ролей здесь, используя шаблон IDoThisForYou, вы можете называть их, как вам нравится).

Контроллер игры затем реализует оба этих интерфейса, и каждая из двух панелей принимает соответствующий интерфейс. Интерфейс обновления будет иметь метод, называемый RequestUpdate, а интерфейс результатов будет иметь AddResultsListener. Оба эти метода появляются в классе Game.

Независимо от того, получаете ли вы Игру, чтобы слушать Окно или Окно в Игру, разделяя вещи через интерфейсы таким образом, вы значительно облегчите разделение Игрового контроллера и делегируете свои обязанности, как только начнете получение действительно сложно, что они всегда делают!

+0

Итак, после того, как я назвал 'game.pushEvent (e)' Мне нужно вызвать 'ChangeObject changes = game.getChanges()' или что-то еще? Кажется странным сделать класс только для передачи информации. –

+0

Обычно я просто создаю небольшой интерфейс, а не создаю класс ChangeObject, а затем помещаю этот интерфейс непосредственно в игру. Если он становится слишком сложным, вы можете разделить еще один класс позже и использовать Dependency Injection, чтобы передать его как в Game, так и в Window. – Lunivore

0

Я думаю, вы должны реализовать Observer desig n pattern (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 обозначает конкретное имя события (Нажмите, 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, но я считаю, что этот шаблон может вам помочь!

+1

MVC основан на шаблоне проектирования Observer в любом случае - вот что делает 'game.notifyEvent (...)'. – Lunivore

Смежные вопросы