Правильная реализация MVC в Java - PullRequest
4 голосов
/ 25 февраля 2011

Я все еще пытаюсь понять, как правильно реализовать MVC.В этом примере @ oracle говорит, что представление имеет доступ к контроллеру.И другой учебник @ leepoint указывает, что у представления есть доступ к модели.Это разные вариации MVC?В моем случае я следовал учебнику на сайте Oracle с некоторыми изменениями (я добавил функцию в AbstractController getModelProperty, которая позволит мне получить значение полей текущих зарегистрированных моделей, но также может иметь смысл передатьмодель в качестве параметра (как указано в руководстве leepoint) для упрощения и, вероятно, оптимизации доступа к данным для представления.

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 25 февраля 2011

Представления привязаны к моделям.Поскольку представления визуализируют модели, они должны иметь глубокие знания о модели, и просто невозможно обойти ее.Некоторые виды являются общими, и у них есть «общие» модели.Здесь вы можете попытаться адаптировать свою фактическую модель к общей, чтобы «общее» представление могло использовать ваши данные.Но даже с этими общими моделями представления по-прежнему тесно связаны с ними.

Модели управляют данными, состоянием.В то время как представление обладает глубоким знанием модели, модель независима от представления.Это просто не волнует.Таким образом, вы можете иметь несколько видов для одной и той же модели.

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

Простой пример: игровой объект может получить урон от пули,и это снижается до уровня ниже 50% здоровья.Вид может видеть, что состояние здоровья уменьшилось, и изменить изображение модели (скажем, добавить дым или что-то еще).

Контроллер обычно тесно связан с видом и моделью.Он знает возможности представления (например, его размер и другие области интереса) и знает, как изменить модель.Например, если щелкнуть мышью, контроллер преобразует точку мыши в координату относительно вида, и от этого определяет, какой объект был нажат.Как только он определяет объект, по которому щелкнули, он может установить модель для объекта, скажем, "selected".

Затем модель сообщает, что ее свойство "selected" изменилось.Представление видит это, находит ограничивающий прямоугольник для модели, которая изменилась, и делает недействительным этот прямоугольник на своем дисплее.

Наконец, Java приходит в себя и говорит представлению «Эй, нужно нарисовать 10,10,100,100 Rect»,И представление находит модели в этом прямоугольнике, рисует новое представление объекта с «выбранной» границей или чем-то еще.

Вот как работает весь цикл.

0 голосов
/ 25 февраля 2011

Статья из Википедии о MVC довольно хорошо фиксирует отношения: у View есть Модель, у Controller есть и View, и за Model, Model ничего не знает как о View, так и о Controller.

InВ некоторых случаях может быть полезно упростить шаблон, комбинируя View и Controller.

0 голосов
/ 25 февраля 2011

Библиотеки Swing - очень хорошая реализация шаблона MVC. Просто немного изучите API, и он все встанет на свои места.

0 голосов
/ 25 февраля 2011

... говорит, что представление имеет доступ к контроллеру.

Да, представление содержит ссылку на контроллер для пользовательских жестов. (в графическом интерфейсе представление и контроллер иногда смешиваются).

... что представление имеет доступ к модели.

да, представление обычно содержит ссылку на модель (ы) (может иметь более одной).

... Это разные варианты MVC?

Есть множество вариантов.

... но также имеет смысл передавать модель в качестве параметра (как указано в уроке по leepoint) ...

обычно модель имеет представления, которые являются наблюдателями, и представление обновляется, когда получает сообщение об обновлении, а не вызывается непосредственно контроллером. первый отделяет вид от контроллера.

0 голосов
/ 25 февраля 2011

Это оба. MVC имеет треугольные отношения друг с другом, с контроллером наверху. Более новый путь - использование MVP, когда Presenter находится между моделью и представлением.

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

...