Да, что вы делаете, имеет смысл. Я нахожу более интуитивным, чтобы Window слушал Игру, чем наоборот. Я также обнаружил, что Java гораздо удобнее обслуживать, если вы выделяете разные области графического интерфейса и передаете игру в каждый из них через мелкозернистый интерфейс. Я обычно получаю элементы GUI, чтобы слушать изменения в модели и запрашивать любые взаимодействия, с которыми нужно иметь дело. Этот способ упрощает модульное тестирование, и вы можете заменить GUI подделкой для приемочного тестирования, если у вас нет подходящего набора автоматизации или даже для ведения журнала.
Обычно расщепление результатов графического интерфейса на некоторых панелях чисто слуховое, а некоторые панели чисто взаимодействуют. Это создает действительно прекрасное разделение проблем. Я представляю панели с их собственными классами, расширяя JPanel
, и пусть Окно передает им игру по строительству.
Так, например, если у меня есть две панели, одна из которых отображает результаты, а одна из которых имеет кнопку «Обновить», я могу определить два интерфейса: INotifyListenersOfResults
и IPerformUpdates
. (Обратите внимание, что я использую интерфейсы на основе ролей здесь, используя шаблон IDoThisForYou
, вы можете называть их, как вам нравится).
Контроллер игры затем реализует оба этих интерфейса, и каждая из двух панелей принимает соответствующий интерфейс. Интерфейс обновления будет иметь метод, называемый RequestUpdate
, а интерфейс результатов будет иметь AddResultsListener
. Оба эти метода появляются в классе Game.
Независимо от того, получаете ли вы Игру, чтобы слушать Окно или Окно в Игру, разделяя вещи через интерфейсы таким образом, вы значительно облегчите разделение Игрового контроллера и делегируете свои обязанности, как только начнете получение действительно сложно, что они всегда делают!
Итак, после того, как я назвал 'game.pushEvent (e)' Мне нужно вызвать 'ChangeObject changes = game.getChanges()' или что-то еще? Кажется странным сделать класс только для передачи информации. –
Обычно я просто создаю небольшой интерфейс, а не создаю класс ChangeObject, а затем помещаю этот интерфейс непосредственно в игру. Если он становится слишком сложным, вы можете разделить еще один класс позже и использовать Dependency Injection, чтобы передать его как в Game, так и в Window. – Lunivore