2016-02-16 5 views
2

В моей программе контроллер просто перехватывает нажатия клавиш с помощью функции. Значит, должен ли он ссылаться на него? . держа ссылкуmvc где хранить ссылки на контроллеры?

Model model = new Model(); 
View view = new View(model); 
Controller controller = new Controller(model,view); 

или нет

Model model = new Model(); 
View view = new View(model); 
new Controller(model,view); 

Внутри контроллера

public Controller(Model model, View view) 
{ 
    this.model = model; 
    this.view = view; 
    view.setOnKeyPressed(this::doSomething); 
} 

public void doSomething(KeyEvent event) 
{ 
    System.out.println("key pressed"); 
} 

Может быть, я реализовал класс контроллера неправильно и неправильно MVC шаблон. Но с тем, что я написал до сих пор, для меня нет оснований хранить ссылку на объект контроллера.

+0

Если вам не нужна явная ссылка на контроллер, тогда нет необходимости хранить его, imho (другие мнения могут отличаться). Возможно, вам это понадобится позже. Обратите внимание на то, что здесь неявно указывается ссылка на контроллер, когда вы регистрируете обработчик нажатой клавиши. –

ответ

3

Я не уверен, что этот вопрос действительно отвечает, так как это, вероятно, слишком широким и/или слишком мнение на основе , Однако ...

MVC - очень слабо определенный узор. Это действительно происходит примерно через 40 лет (или более) до самых ранних исследований в области разработки графического интерфейса в Xerox PARC. Поскольку это было так долго, и его основной вариант использования (архитектура графического интерфейса) значительно расширился, он разветвлен на несколько подзадач и вариантов. Следовательно, вы обнаружите, что «MVC» означает много разных вещей для разных разработчиков. В частности, MVC в среде веб-приложения несколько отличается (imo) с MVC в контексте, о котором вы говорите, потому что в среде веб-приложения он должен сидеть над циклом запроса-ответа. В остальной части этого ответа/обсуждения основное внимание уделяется оригинальной версии MVC с «толстым клиентом», в которой представление и контроллер находятся в памяти в рамках одного процесса и могут связываться напрямую (а не через протокол запроса-ответа, такой как HTTP).

Для меня окончательное руководство по MVC в контексте GUI рабочего стола - это номер essay on GUI architectures от Martin Fowler.

Я бы сказал, что «классический» MVC характеризуется:

  • Имея три компонента:
    • модель, которая обеспечивает доступ к данным, может предоставить механизмы для регистрации слушателей для уведомления изменения данных и не имеет представления о представлении данных
    • Вид, который наблюдает данные в модели и обновляет себя при изменении данных (это отличает классический MVC от мне форма MVP)
    • Контроллер, который обеспечивает «вид логику»: как правило, это означает, что он реагирует на ввод пользователя и обновление от модели (не вид) в результате

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

Движущей силой этого проекта является возможность предоставления нескольких презентаций (представление о представлениях как комбинации вида и контроллера) данных, которые сохраняются синхронно. Шаблон достигает этого, ссылаясь на все, хотя модель: контроллер одной презентации может обновить модель; поскольку все взгляды наблюдают за моделью, все они видят эти изменения и каждый ответственен за их обновление соответственно. Контроллер, который изменил представление, не должен знать о каких-либо других представлениях, которые могут наблюдать данные, чтобы синхронизировать все представления.

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

Появились несколько вариантов этой идеи (см. Фаулер). Один популярный (который также имеет несколько собственных вариантов) - Model-View-Presenter. В этом варианте контроллер заменяется на «Presenter», который берет на себя часть или даже все обязанности по обновлению представления. В одной из форм этого (который Фаулер называет «Пассивный взгляд»), представление полностью лишено логики и просто выводит элементы управления. Ведущий обрабатывает ввод пользователя, обновляет представление и модель, когда пользовательский ввод возникает в представлении, и наблюдает за моделью, обновляя представление, если оно изменяется. Этот вариант имеет преимущества с точки зрения проверяемости и способности отлаживать, но существует, возможно, более плотная связь между представлением и презентатором, чем между представлением и контроллером. (Относительно легко предоставить несколько контроллеров для представления, поскольку предоставление нескольких презентаторов для пассивного представления становится намного более сложным, и ведущие обычно должны иметь некоторые знания друг о друге.)

JavaFX фактически предоставляет поддержку «из коробки» для этого стиля архитектуры, используя FXML в качестве (как правило, пассивного) представления и предоставляя удобные способы подключения к тому, что он называет контроллером (что, возможно, больше докладчика). Свойства JavaFX позволяют легко создавать модели, которые могут быть легко видны при просмотре или презентатором по мере необходимости.

На практике вы обычно найдете гибрид этих работ лучше всего в большинстве случаев. Средство среднего масштаба будет использовать шаблоны типа MVC/MVP в нескольких местах в разных масштабах. Вы часто обнаружите, что контроллерам/докладчикам удобно иметь некоторые знания друг о друге и общаться между ними, и в этом случае вам, очевидно, потребуется сохранить ссылки на контроллеры.

Так что ответ на ваш вопрос, вероятно, просто «зависит от того, что вам нужно». Если вам не нужна ссылка на контроллер, нет необходимости его хранить. Действительно, при стандартном использовании FXML в JavaFX контроллер класс просто указан в представлении (FXML); FXMLLoader создает экземпляр контроллера из этой информации и при необходимости проецирует представление и контроллер. У вас часто даже нет ссылки на экземпляр контроллера в вашем коде вообще. Хотя, как видно из this popular JavaFX question, вы можете получить его, если и когда вам нужно. В полностью «чистом» классическом MVC все изменения состояния производятся с помощью модели, а наблюдения видят ее, поэтому вам никогда не понадобится доступ к контроллеру. Фаулер указывает на некоторые приятные примеры, когда это не работает так чисто, как кажется: во-первых, что некоторое состояние и связанная с ним логика действительно являются частью представления и не имеют места в модели, а во-вторых, что механизмы регистрации/уведомления могут очень сложно отладить ваше приложение.

0

Вам понадобится экземпляр контроллера, который будет создан для вас при нажатии клавиши в графическом интерфейсе. Таким образом, вам понадобится, чтобы быть слушателем, который слушает нажатия клавиш.

После регистрации регистратора GUI его инфраструктура отвечает за создание экземпляра этого контроллера и передачу представления этому контроллеру.

(Таким образом, вам не нужно дескриптор контроллера - его ручка всегда с каркасом.)

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

Это как работа всех MVC в ...

+0

Это * возможно * имеет некоторое сходство с архитектурами MVC, предназначенными для сидения поверх протоколов связи, таких как HTTP, но на самом деле не похоже на MVC в контексте графической библиотеки рабочего стола, такой как JavaFX. Например, MVC можно легко реализовать без каких-либо фреймворков. –

Смежные вопросы