Реализация MVC View и контроллера связи. (Джава) - PullRequest
2 голосов
/ 08 марта 2011

В моем классе мы изучали различные проекты, такие как MVC и MVP. В настоящее время я пишу приложение, которое отображает данные в JTable и пользовательский график. Мой вопрос заключается в том, как мне установить связь между View и Controller.

Например, у меня есть кнопка, которая должна импортировать данные из файла в модель. Я думаю, что мне нужно, чтобы View уведомлял контроллер о том, что пользователь хочет импортировать файл. Затем контроллер выполняет необходимую логику для этого. Как вид должен делать это? Я вижу пару вариантов. 1) Сделайте, чтобы контроллер создал внутренний класс, который вызывается всякий раз, когда пользователь нажимает кнопку импорта. В этом случае контроллер должен был бы вызвать метод представления, чтобы увидеть, какой файл пользователь хочет импортировать. 2) Пусть представление обнаружит событие и затем вызовет соответствующий метод в контроллере, передав ему имя файла.

Возникает вопрос: знает ли представление о контроллере? Я знаю, что нет правильного ответа на эти вещи, но какой будет лучший способ?

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Как вы, возможно, знаете, слой Controller в большинстве случаев тесно связан со слоем View.

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

Уровень контроллера должен действовать как сервисный уровень для представления. Так да. Представление должно знать о контроллере. И, если предыдущее утверждение верно, контроллер не может связаться с представлением.

Я создаю свою бизнес-логику (мой @EJB или Spring's @Service) в слое, полностью основанном на POJO. Это мой переносимый бизнес уровень.

Контроллер - это просто мост между представлением и уровнем бизнес-правил. Он вызывает бизнес-методы, правильно (иногда) форматирует их ответы и отправляет их обратно в представление. В этом контексте контроллером может быть веб-служба, управляемый компонент, набор тестов и т. Д. ...

0 голосов
/ 08 марта 2011

Я обычно делаю Просмотров как Слушатели из Контроллер .Таким образом, я могу иметь несколько различных представлений одного и того же контроллера .Все представления должны реализовывать общий интерфейс.Я предоставляю доступ из View в Controller с помощью инжектора конструктора.Таким образом, это может быть что-то вроде

InterfaceWithMethodThatViewCanCall controller = new ConcreteController(new Model);
SomeView view = new ConcreteSomeView(controller);
controller.addListener(view);

Другой способ, которым я сейчас пытаюсь воспользоваться, - это EventBus для связи.Я бы порекомендовал вам заблокировать GWT , какие примеры использования MVP.

* К сожалению, я не читал ни одной хорошей исследовательской публикации по этой теме.

0 голосов
/ 08 марта 2011

Так или иначе, представление должно знать о контроллере. По моему опыту, события, сгенерированные GUI (такие как нажатия кнопок, перетаскивание и т. Д.), Лучше всего обрабатывать в самом представлении, поскольку они зависят от типа используемого вами представления (будет значительно отличаться, если Пользовательский интерфейс был голосовой, например). Контроллер должен предоставлять API, такие как

importFile(String filePath)

с вашим 1) подходом, вам придется изменять контроллер всякий раз, когда вы добавляете новый вид / меняете вещи вокруг в представлении. 2) подход лучше.

...