Это хороший способ обработки событий в Java? - PullRequest
2 голосов
/ 10 октября 2010

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

А Window класс - вид. Это представление Мира в настоящий момент. Также есть класс Game - контроллер. (Реализация модели не имеет значения для этого вопроса).

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

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

ТАК, это звучит как то, что имеет смысл для вас?

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

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

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

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

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

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

0 голосов
/ 10 октября 2010

Я думаю, что вы должны реализовать шаблон проектирования 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 обозначает конкретное имя события (Click, KeyPress, EndApplication, WhwhatYouWant). Затем заставьте ваш наблюдаемый класс реализовать 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, но я верю, что этот шаблон может вам помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...