Развязка вида от контроллера в Java MVC Pattern - PullRequest
5 голосов
/ 06 января 2011

Когда вы впервые публикуете вопрос о StackOverflow, пожалуйста, будьте осторожны со мной:)

Из того, что я понимаю, для правильного использования шаблона модель-представление-контроллер необходимо разделить вид и контроллер таким образом, чтобыпредставление ничего не знает о контроллере.У меня возникли проблемы с пониманием того, как сделать это с помощью Java Swing.

Скажем, у меня есть представление (некоторый класс, который расширяет JFrame), и у этого представления есть кнопка.Можно ли с уверенностью сказать, что я хотел бы зарегистрировать контроллер в качестве ActionListener кнопки?Или я могу сделать это слушателем всего представления.

И как мне поступить так, не делая ничего подобного:

button.addActionListener (myController)

в представлении, потому что, если бы я делал это в коде представления, разве он теперь не зависел бы от контроллера?

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

любая помощь оценена!

Ответы [ 3 ]

4 голосов
/ 06 января 2011

Это может помочь не думать о представлении в терминах кнопок и т. Д., А как об интерфейсе. Интерфейс позволяет писать веб-интерфейсы, консоли командной строки и т. Д. И выполнять роль представления.

В случае события вашей кнопки кнопка представляет собой вызов какой-либо команды, выполненной контроллером.

Итак, у вас может быть такой интерфейс:

public interface MyViewIf {
    // used by the controller to register its self as a listener of the view
    public addViewListener(ViewListener vl);
    ...
}

и

public interface ViewListenerIf {
    // used by the View to notify any listeners of control events etc.
    public onViewEvent(ViewEvent ve);
}

Тогда ваш контроллер будет реализовывать ViewListenerIf и регистрировать его самостоятельно в сгенерированном на фабрике экземпляре MyViewIf. Таким образом, контроллеру не нужно знать какие-либо особенности вашего класса (ов) представления.

Ваш класс представления будет затем внутренне обрабатывать свои собственные события кнопок, превращать их в объекты ViewEvent и вызывать onViewEvent () на контроллере, который зарегистрировал себя в представлении, оставляя View на 100% забывшим о существовании контроллера. 1013 *

1 голос
/ 06 января 2011

Создайте actionlistener в вашем классе просмотра. Из вашего списка действий вы звоните своему контроллеру.

Код для actionlistener:

controller.doButtonClick();

Это означает, что вам нужно ввести вашу модель и контроллер в вид. Вот как я это делаю.

1 голос
/ 06 января 2011

Взгляните на Spring Framework , чтобы получить представление о реализации шаблона MVC. Краткий весенний учебник Учебник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...