Java MVC: обновление View, который наблюдает за несколькими моделями - PullRequest
2 голосов
/ 29 октября 2011

В моем приложении MVC я отображаю график, используя Swing. Управляется несколькими панелями с разными настройками. У меня есть MainModel для создания и подачи DomainObject, что ChartView выходов. Поскольку имеется несколько панелей, и я не хотел увеличивать размер MainModel, он создает ChildModels для каждой панели с их собственными представлениями. В свою очередь, MainController прикрепляет ChildControllers к ним. «ChartView» регистрирует себя, чтобы наблюдать изменения в MainModel для обновления вывода.

Первая проблема заключается в том, что, поскольку ChildModels в основном являются частями MainModel, их изменения должны запускать обновления на ChartView (помимо их собственных представлений). Чтобы решить эту проблему, я должен был MainModel зарегистрировать своих детей с помощью ChartView вручную. Итак, теперь у меня есть несколько моделей, прикрепленных к ChartView. Хотя я знаю, что это, вероятно, вызвано плохим дизайном (модель, которая создает дочерние модели и т. Д.), Решение работало нормально. Но я хотел бы услышать другие подходы к разрушению одной большой модели. У меня была одна идея - MainModel прослушать изменения в ChildModels и уведомить ChartView. Таким образом, только одна модель взаимодействует с ChartView.

Вторая проблема - запуск по цепочке ChartView обновлений. Это происходит потому, что все эти панели с настройками имеют некоторые значения, которые зависят друг от друга. Таким образом, если пользователь вводит какое-либо значение в first panel, диапазон, который может принимать значение от second panel, изменяется. Когда контроллер обновляет second panel, он запускает StateChange Event. И поскольку ChartView был подписан на прослушивание обновлений на ChildModels, он будет получать уведомления об обновлениях от обеих панелей. Теперь в моем случае у меня 8 из них. Это делает один единственный ввод от пользователя, что приводит к перерисовке 8 ChartView. Что, вероятно, опять же является результатом плохого дизайна. Но в этом случае я понятия не имею, как правильно обрабатывать эти множественные уведомления об обновлениях и GraphView обновлять только по последнему запросу. Моим решением было сделать транзакционные обновления. Вместо одного уведомления для просмотра модели отправляют уведомления beginUpdate и endUpdate. Только после того, как представление получает endUpdate, оно запрашивает у модели обновленные данные. Таким образом, уведомления об обновлении вложенных моделей становятся «отключенными».

Я хотел бы знать, как вы подходите к этим проблемам. Спасибо

1 Ответ

0 голосов
/ 29 октября 2011

Из того, что я понимаю о вашей озабоченности, ошибка заключается в том, что ChartView слушает несколько моделей одновременно. MVC предполагает, что есть только одна модель. Так что ChartView следует подключить только к MainModel. Цель MainModel - правильно мультиплексировать изменения, поступающие с панелей, и отправлять события на ChartView. Ваша идея иметь MainModel, слушая моделей ребенка и подавая ChartView, выглядит для меня правильным дизайном.

Что касается вашего второго вопроса, обычное использование состоит в булевом параметре (например, multiple) в событии. Значение true указывает, что следующее событие является частью последовательности, а false означает, что последовательность завершена. Если событие не является частью последовательности, установите для параметра значение false (что означает последовательность длины 1). В вашем случае просто проигнорируйте события с true и дождитесь событий false для запроса стабильного состояния.

...