Facebook google+ e-mail
Учимся программировать на JAVA
Практикум по программированию на языке Java

Занятие 8. Схема «Модель/Вид/Контроллер» (MVC)

Замечание

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

На предыдущем занятии ( Занятие 7. Графические интерфейсы: импорт пакетов, наследование ) мы начали обсуждение внутренней «кухни» графических интерфейсов. Если помните, мы немало времени уделили тяжеловесным (heavyweight) и легковесным (lightweight) компонентам. О тяжеловесных компонентах и о том, как они взаимодействуют с операционной системой мы уже кое-что рассказывали ранее и возвращаться к ним больше не будем; поговорим о легковесных компонентах.

Если помните, мы несколько раз подчеркивали, что операционная система не имеет ни малейшего представления о том, что легковесные компоненты вообще существуют. Все, что «известно» операционной системе – это некоторое окно, а что происходит внутри окна – это операционной системе безразлично.

Давайте для начала наведем некоторый порядок в терминологии. Мы уже неоднократно встречались с понятием «компонент». Компонент – это элемент графического интерфейса, предназначенный для отображения и ввода данных, а также для взаимодействия с пользователем программы. К компонентам относятся кнопки, метки, списки, деревья, таблицы, переключатели и т.д. Но компоненты не «висят» в воздухе, они к чему-то «прикреплены». Всякая кнопка, метка и проч. является частью контейнера. Контейнер – это либо окно (такое, как мы видели раньше), либо панель, т.е. некоторая область внутри окна, предназначенная для размещения и группировки набора компонентов. Разумеется, все это можно было сформулировать более строго, но мы считаем, что всему свое время. В дальнейшем, когда мы начнем разрабатывать графические интерфейсы, только что сказанное станет более понятным. А пока вернемся к компонентам.

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

Повторимся, что «надеяться» на операционную систему мы не можем. Она дала возможность сформировать и вывести на экран окно и это, практически, все. Стало быть, ничего другого не остается, как возложить на само это окно все перечисленные выше задачи по управлению компонентами. Для всего этого разработчики Java использовали механизм, появившийся впервые в языке программирования Smalltalk-80 в 1980 году.

Этот механизм называется «модель/вид/контроллер» (от англ. Model/View/Controller, но обычно используется аббревиатура MVC). Механизм MVC – это т.н. «паттерн» (англ. pattern), т.е. шаблон, описывающий 1). как нужно отображать компонент (вид), 2). как компонент наполняется данными (модель) и 3). как обеспечить взаимодействие между видом, моделью, пользователем и окружением (контроллер).

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

Итак, что такое модель, что такое вид, и что такое, наконец, контроллер? Как они взаимодействуют друг с другом и почему этот подход столь важен для программирования на Java?

Обобщенно схема MVC выглядит приблизительно так, как показано на следующем рисунке (на самом деле все далеко не так просто и схема MVC может довольно широко варьироваться, но это относится уже к деталям реализации):

Программируем на Java. Механизм Модель-вид-контроллер

Наше изложение не будет претендовать на точность и детальность (точность и детали важны, когда вам самим понадобится реализовать механизм MVC в своих программах, но тогда вам придется обратиться к документации и специальной литературе). Поэтому мы постараемся обойтись обычным описанием, своего рода взглядом с «высоты».

Для дальнейшего изложения мы будем использовать следующую таблицу

Программируем на Java. Основные концепции MVC

(как именно была сформирована эта таблица – сейчас не важно; вскоре вы научитесь создавать подобные и даже куда более сложные таблицы самостоятельно).

Начнем с вида. Вид – это то, что вы видите на экране, в данном случае – таблица с данными. Таблица, как легко заметить, имеет стандартное представление в виде сетки, образованной строками (записями, рядами) и колонками (полями, столбцами). Прямоугольная область, ограниченная горизонтальными строками и вертикальными колонками называется ячейкой. Колонки имеют заголовки. Каждая колонка отображает свой тип данных – строки, числа, даты. Колонки можно изменять по ширине; порядок колонок можно менять. Строки и колонки в целом, а также отдельные ячейки таблицы можно выделять различными цветами и шрифтами. При необходимости можно предусмотреть сортировку внутри любой колонки. Одним словом, все ограничивается лишь вашей фантазией или фантазией вашего заказчика. Все, что относится к виду таблицы можно еще долго описывать (таблица это вообще один наиболее сложных и насыщенных графических интерфейсов), но сказанного, по-видимому, достаточно.

Но сама по себе, без данных, таблица вряд ли кому-то интересна (что толку разглядывать пустую сетку без данных). Данные – вот для чего нужна таблица. И эти данные поступают в вид благодаря модели.

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

А что можно сказать о контроллере, какова его роль? Допустим, мы ошиблись и нужно изменить данные о возрасте одного из «участников» (скажем, мадам Грицацуевой). Если таблица открыта на редактирование, то достаточно дважды кликнуть мышью на нужной строке:

Программируем на Java. Основные концепции MVC

После этого вы можете отредактировать ячейку и получить такой результат:

Программируем на Java. Основные концепции MVC

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

Вот, пожалуй, и все, что в данный момент нужно сказать о схеме MVC. Обычно, программист не особенно задумывается о том, что где-то в каких-то глубинах существуют виды, модели и контроллеры. Создатели Java позаботились о том, чтобы подобные детали не требовали особенного внимания от программиста и создали типовые «суповые наборы» компонентов, подобно конструктору «Lego». Обычно, таких наборов вполне достаточно для создания простых стандартных графических интерфейсов. Но если возникает необходимость, то руки у программиста полностью развязаны и он может вмешаться в работу встроенных механизом и даже полностью их заменить своей реализацией.

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

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

 

Занятие 7. Графические интерфейсы: импорт пакетов, наследование

 

Занятие 9. Диалоговые окна (начало)

 

Автор: Alex Tuesday

 

Все уроки ... 24.02.2014