LINUX.ORG.RU

Подскажите, пожалуйста, разобраться с MVC

 ,


0

2

Допустим, есть у меня модель:

Class SomeModel {
private ArrayList<SomeType> elements;
public getElements() {..}
public setElements(...) {...}
public addPropertyChangeListener(PropertyChangeListener e) {...}
}

Есть формочка

Class SomeForm {
<form code>
public SomeForm() {
    SomeModel someModelInstance = new SomeModel();
    SomeModel.addPropertyChangeListener(new PropertyChangeListener{<some property bind code>}
}

} 

А как сделать контроллер? Хранить ссылку на SomeModelInstance и дёргать из неё методы в экшнлистенере кнопки? И как инициализировать это всё хозяйство, где-то предусмотреть класс launcher с методом main чтобы из него создавать форму, кормить её конструктор ссылкой на уже инициализированный бин или в самой форме создавать бин?

А так же как биндить модели, например, AbstractListModel, в классе формочки делать внутренний класс, расширяющий AbstractListModel, в его конструкторе добавлять в модель PropertyChangeListener и подписываться на ивенты изменения данных в массиве? Если да, то PropertyChangeEvenet надо кормить OldValue и NewValue, получается, мне для получения OldValue надо склонировать массив, а это же долго! Как тогда делать PropertyChangeEvent для массивов?

А как сделать контроллер?

Тебе с него и нужно было начинать. После запроса браузера происходит расшифровка get/post и вызов одного из контроллеров. Дальше контроллер уже решает, что ему нужно, получить данные из базы с помощью модели/что то записать в базу/сгенерировать ответ в json/вызвать представление завернутое в шаблон...

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Тогда получается, применительно к моему случаю десктопного приложения, мне надо ActionEvent от кнопки давать контроллеру?

OldWiseCat ★★
() автор топика
Ответ на: комментарий от OldWiseCat

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

TDrive ★★★★★
()

MVC - это абстрактная абстракция. Ньюансы воплощения могут оказывать не меньшее влияние на результат, чем сама обощенная концепция.

Вот один пример реализации MVC:

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

Класс SomeForm унаследуется от интерфейса отображения и будет реагировать на события изменения модели. Т.е. когда модель поменяла что-то у себя,то она вызвает некий метод интерфейса SomeView. Класс SomeForm реагирует на это изменение и приводит ГУЙ в состояние, согласованное с моделью, возможно для этого нужно будет посмотреть на модель и её данные.

Теперь о контроллере. Методы интерфейса SomeController будет вызывать класс SomeForm, реагируя на действия пользователя. Пользователь нажал кнопку на форме/кликнул по элементу/нажал Enter на клавиатуре или что-то ещё, класс SomeForm осмыслит этот ввод и сообщит контроллеру о том, что надо совершить некую конкретную операцию, вызвав соответствующий метод интерфейса контроллера.

Итоги:

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

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 3)

А так же как биндить модели, например,

Не надо ничего биндить, это изврат. Просто вызываешь нужный метод у нужного интерфейса. Вызов метода и будет реакцией на событие.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Ньюансы

Вот за это слово надо расстреливать без суда и следствия. Так же как за -тся vs. -ться.

anonymous
()
Ответ на: комментарий от anonymous

надо расстреливать

Как и всех хикки-анонимусов, но жизнь заставляет терпеть их присутствие.

pathfinder ★★★★
()

Посмотри, как это сделано у грамотных пацанов, например, в Яблоко Какао.

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

З.Ы. На десктопной жабе лет десять не писал. А когда писал, ещё ничего не знал про МВЦ.

Apple-ch ★★
()

Возможно поможет dependency injection.

События можно разгребать также, как это сделанно в scene2d. Каждый Listener возвращяет bool, true если событие обработанно, иначе false.

zinfandel ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.