Да, то, что вы делаете, имеет какой-то смысл. Я считаю гораздо более интуитивно понятным, чтобы Окно слушало Игру, чем наоборот. Я также обнаружил, что Java гораздо удобнее в обслуживании, если вы разделяете различные области графического интерфейса и передаете Игру в каждую из них через детальный интерфейс. Обычно я получаю элементы GUI для прослушивания изменений в модели и запрашиваю любые взаимодействия, с которыми нужно разобраться. Такой способ упрощает модульное тестирование, и вы можете заменить графический интерфейс на фальшивку для приемочного тестирования, если у вас нет подходящего пакета автоматизации или даже просто для регистрации.
Обычно разделение графического интерфейса приводит к тому, что некоторые панели просто слушают, а некоторые панели просто взаимодействуют. Это делает для действительно прекрасного разделения проблем. Я представляю панели с их собственными классами, расширяющими JPanel
, и позволяю Окну передавать им Игру на строительстве.
Так, например, если у меня есть две панели, одна из которых отображает результаты, а другая на кнопке «Обновить», я могу определить два интерфейса: INotifyListenersOfResults
и IPerformUpdates
. (Обратите внимание, что я делаю ролевые интерфейсы здесь, используя шаблон IDoThisForYou
; вы можете называть их как хотите).
Затем игровой контроллер реализует оба этих интерфейса, и каждая из двух панелей принимает соответствующий интерфейс. Интерфейс обновления будет иметь метод с именем RequestUpdate
, а интерфейс результатов будет иметь AddResultsListener
. Оба эти метода затем появляются в классе Game.
Независимо от того, получаете ли вы Игру для прослушивания Окна или Окна к Игре, разделяя вещи через интерфейсы таким образом, вы значительно облегчаете разделение игрового контроллера в дальнейшем и делегирование его обязанностей, как только вещи начинают поступать. действительно сложно, что они всегда делают!