Model-View-Controller (12. Шаблоны группы Model-view-controller), страница 2

PDF-файл Model-View-Controller (12. Шаблоны группы Model-view-controller), страница 2 Распределённые ИС и базы данных (5782): Лекции - 9 семестр (1 семестр магистратуры)Model-View-Controller (12. Шаблоны группы Model-view-controller) - PDF, страница 2 (5782) - СтудИзба2015-08-23СтудИзба

Описание файла

Файл "Model-View-Controller" внутри архива находится в следующих папках: 12. Шаблоны группы Model-view-controller, Дополнительные материалы. PDF-файл из архива "12. Шаблоны группы Model-view-controller", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "распределённые ис и базы данных" в общих файлах.

Просмотр PDF-файла онлайн

Текст 2 страницы из PDF

Далее, выделя контроллер в его классическом варианте, можно столкнуться с недостатком связанным с особенностью роли Модели в классическом МЧС. Как уже говорилось, МЧС вЂ” это не просто паттерн, а набор паттернов, и Модель, в классическом МЧС, на самом деле является медиатором (Меа1асог) между Контроллером/Представлением и реальной моделью модвЬмев-Соп!го!!ег в .не! )Ктр://епм1К1реоа.огц/уг1к1/Мео1а1ог ра11егп 011р //г)о/ас1огу.сот/Ра11етз/Р011егпМеоа1ог.азрх В обязанности Медиатора входит транслировать вызовы Конгпроллвра в нужные модели приложения и реализовать механизм оповещения Првдстввпвной, как правило посредством паттерна Обозреватель (ОЬзегуег), о том, что нижележащая модель приложения изменилась. Таким образом, Модель должна обладать набором методов реализующих логику работы с пользовательским интерфейсом, однако сама Модель не может влиять напрямую на этот самый интерфейс (представления), в противном случае это убило бы саму идею паттерна, что приводит к необходимости реализации в Првдставлвнои логики обработки событий и, как следствие, «утолщению» Представления.

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

Таким образом нам нужна модификация паттерна которая, с учетом упомянутых недостатков, позволяла бы следующее: ° Умела эффективно отделять модель от ее представлений. ° Позволяла пользоваться дизайнером форм и имеющимися библиотеками, без ограничений. ° Позволяла тестировать логику Контроллера независимо от Представления и вообще, сводила бы логику Представления к минимуму.

° Позволяла бы избегать лишних обращений к Модели. Одним из возможных решений, отвечающим всем вышеприведенным требованиям, и является паттерн Мосе!-Ч1еа-Ргезеп1ег (МЧР). Паттерн Мобе1-Ч1еа-ргезептег, является очередной модификацией МЧС. Если смотреть просто на схему, то визуально отличить его от МЧС довольно сложно, поэтому лучше всего иллюстрировать его реализацию на кусочке реального кода. Код, конечно, реальный весьма относительно и довольно примитивен, однако надеюсь, вполне достаточнен для иллюстрации паттерна - мы попробуем реализовать программу, переводящую градусы цельсия в фаренгейты и наоборот, ну и, естественно, визуально это дело отображающую.

Если бы мы разрабатывали наше приложение в привычном стиле, навязываемом УУ1пГоггпз, то скорее всего начали бы с набрасывания формочек, однако в данном случае мы зайдем с другой стороны и начнем с реализации Модели. И так, наша Модель должна уметь принимать данные температуры как в цельсиях так и в фаренгейтах и пересчитывать их в других величинах. Типичная Модель для данной задачи могла бы выглядеть следующим образом; роь1 с с'ааа Моде1 рсаоаое боао1е оа10аваагепЛе1С 32; ргаоаСе бооб1е оа1оеое1авеа = 0; мосе)-ч)вчг-Соп)го))ег в .не! своп па ч> агуся в г кепс Фарс-гпсяеа сl вг гпа.-у> рпс).~ с аспЬ) е ча1сеГапгеппе(Г дев ( геясгп ча1пеГапгсппс' с; ) вес ( ча1пераьгеп)ге11 = ча'пе; ча1пеСе1яьсв = ( ча1пераьгеппе1à — 32) * 5 У 9) свпвгаасч> с аписе в с:капе )Сеп сив ауясгпга уг рсЬ1ас сспЬ' е ча1пеСе' выла ( 9ес ( гешпсп ча1пеСе1язпв; яес ( ча1пеСе1вьпв = ча1пе) ча1пераьсепье11 = ча1пеСе1взпя * 9 г' 5 а 32) Следующим этапом будет реализация Ргевеп)ег-а, эта сущность заменяет Контроллер в классическом МчС - она делает все тоже самое, что и Контроллер, плюс кое-что еще.

Более подробно о его функциях мы поговорим позже. Ргевепгег может иметь прямую ссылку на экземпляр Модели. В то же время Ргевептег должен иметь ссылку и на экземпляр или даже экземпляры Представления, которые будут отображать данные Модели. Однако здесь, в отличие от случая с Моделью, создание конкретного экземпляра конкретного класса Представления, может обернуться большими неудобствами. При наличии тесной связи между Ргевептег-ом и Представлением будет сложно реализовать замену Представлений и использование нескольких Представлении для одного Ргевеп)ега, к тому же, это затруднит независимое тестирование Ргеяеп1ег-а... Да и в целом, наличие такой связи может привести к неправильной работе Ргевептег-а при изменении Представления, что совсем не хорошо. Решить проблему зависимости Ргевептег-а от Представления можно с помощью паттерна 1пчегвюп 01 Соп1го) (он же Оерепдепсу 1п)ест)оп по Фаулеру) .

Для этого мы создаем интерфейс Представления через который и будет осуществляться все взаимодействие с Представлениями. ))11 р)оеп.)ч)Уа)реда.огцгг)ч))г)/1пчегя)оп 01 соп(го( ))11р)о)нчууу.та*)п1оч))ег.сот/аг()с)ея/)п)ес()оп.))1т( моов( )у(ев-Соп(~о)!ег в .не( Интерфейс Представления, в нашем случае, будет состоять из свойств для вывода посчитанных значений градусов цельсия и фаренгейта, ввода новых данных и событий оповещающих Ргеяептег, что данные введены. рпЬ1тс 1п ет1асе 1ЧЕен ( заказ у> !/ Вы оп гоагуссп Фагенгейта '!/ </япптату.= уо1б ЯеЬГагепбеЕЬ(бопбзе уа1пе) <яшппа у> Ввыан зоапусоз ',епясан </зппыазу> уо1з( ЯеЬСе1ятпя (з(опЬ1е уа1пе) < взяти г:»> Вно) ~ го~ о якачепнн геену оа </яс ~магу.

бозЬ1о 1прпсооцгее ( Вес; ) <япкгагу> обнггкс язона зпачсг. е по Оярс:.и тету !// </ясетз.у' еуопс ГуепЬНапб)ег<Еуспс)(гдя> ЯеЬГагепЬе(Ь; /// яптпа..';> Собы-ке язона знаненна -о пег сню </зпгввату: еяепс ЕуепСНапа1ег<ЕуепЬЛга > ЯеЬСе1ятпя; После того, как интерфейс готов, надо придумать как подпихнуть экземпляр интерфейса в Ргеяептег. В данном случае, для простой задачи, можно сделать это через конструктор, в более сложных ситуациях РгеяепЬег может получать ссылку на конкретный экземпляр через специальную фабрику представлений или даже сам являться фабрикой, порождающий необходимые Предо(лавления в зависимости от ситуации. ))((р://еп.)в(()0(рейз.оп)/у)()О/Рас(о(у те(боб ра((егп Ы(р://() о Гас(о~у. Сон)/Ра((е и) я/Ра((его Гас(оп/.аярх Наличие интерфейса так же позволяет уже на этом этапе полностью завершить разработку Ргеяепсег-а и заняться его тестированием, несмотря на то, что конкретные Представления еще не готовы и ни один контрол еще не брошен на форму...

( И так, Ргеяептег может выглядеть примерно следующим образом: рпЬ((с с)аяз Ргеяепсег рг1таяе Мобе1 тоое1 = пеы Мопе1() рг'тасе Утеы у1ен; <ямагату> В конструтор пеоепается конкретнып якзеыппяо поел азпенкя к грснскопнт подписка на все нужные событкя. Моея)-Ч)ев-Сонно)!ег е . Не( <я "йп агу> рцЬ) (с Ргеяепхег (1Ч1еы ч(ен) ( ч(еы = чгенг ч1еы.яегсе)я(ця += ген Рчепгпапг))вг<ечепгАгдя>(Опяессв1я(ця)г чгеы.зеГГагепье1Г += пвы Ечепх))апг(1ег<Ечеп А сз>(опзоГРагепнс1Г) ЕебгеяЬЧТеы()г <зц влагу> Обработка собы ия, установка ново"'с зна:ения :радусоз по баренгеяту </зцттеаху> рг1чаге чо1б ОпзеГРагеппе1Г(оЬзесс яепбег, ЕчепХАхдя е) ( ыобе1. ча1це Раьгеппе г г — ч1еы.

1 про е бес гее; ЕевгеяЬУ1ен(); <з~игггаху> '// Обработка события, устанозка ново"о значения традусоз Гелзсия </япгза~у> рг' часе чо1о Опяегсе1я1ця (оЬ )ес~ яегаег, Ечегг Ахая е) ( жобв' .ча1иесе1я1ня = ч1еы. 1прзсоесхее; ЕеГгеяьч1еы()г !// <яия>за<у> ,/// 'бногс~внис .)рог(с газлозгия но ' гии ззансния1ги модсгл ( о сути .) ) пг)(пс ( .рин.-зка) зна ~с~ ий чодеги .

)(рзлс ею с яяо. </зонта "'у рг)часе чо1б ЕеХхеяЬЧТон() ( ч1еы.зессе(з(ця ( ыоае).ча) неСе1я1ця) г ч1еы. ЯоГГахегпае1Г ( ног(в1. ча1цеГангепьегс) В реальных приложениях это, как правило, гораздо более сложный класс, но об этом мы поговорим позже...

В данном случае реализовать интерфейс можно в классе реализующем форму, причем сделать это можно в отдельном проекте, вдруг потом захочется реализовать и )яеЬ- интерфейс? ( Разработка конкретного Представления совсем тривиальна, форма представления наследуется от созданного нами ранее интерфейса, при этом реализация свойств интерфейса примитивна — по сути это просто перекладывание значений из интерфейса в контролы и наоборот. рцЬ1'с рагс1а1 с1аяя Рохыу1ен : Рохт, ХЧ1вуг ( Фхесгоп Реализация ТЧ1ен г// < няг1агу> Яызсд гоадусоз Фагенпейса :/зппзз у. рцЬ1гс бопЬ1в Рахеппв'Г ( зеб ( Гахепье1ГВох.техс = ча1ые.тоЯ(г1по("1)2")г ) /О <зняггз= .> )Лозе)му(ев-Соп(~о)(ег в .Не1 уу/ </ясгпгя -у> рпо1 1 с бопЬ) с Се 1 я то я ( яет ( се1я(пвВох..ехг = ча'пе.тоБ гупч( Ч)2"); ] < в глггга г ч> У l Вяог всвое о зяаиечип тра пустя <увяла'у> рпЬ11с бопЬ1е 1прпГВесгее ( сес ( геппгп Сопчегт.ТовопЬ1е( 1прпЬВох.техт)( ) Фепбтед1оп '/у <зитгвг г> обработка собьюил тоже припхтияяа, ояи просто проб~расмваптсз ,' '/ и соотпетстпу~о ие собв.тлз Ргезегтег-а '!/ <уясггтагу ргачаяе чоуб се1ятпязптгоп С1'ск(оЬ)ест яепбег, ВчепгАгся е) 11 (Бепсе1я1пз != пп11) Бессе1я1пз (ГЬ1я, ВчепГАгся.Етргу) ргучасе чотб Вагепье Гвпьсоп С11сх(оЬ>ссг яепг(ег, ЕчепГАгдя е) ( уг (Беяуагепьетс != пп11) Бес)агегьетс(ГЛБя, )зчепГАгэя.вирту); Ну и, наконец, завершающий штрих, необходимо создать экземпляр Преоставления, подпихнуть его в РгезепГег и запустить всю эту конструкцию на выполнение.

яьа Г)с с1азя Ргоагап: ( [Б'ГАТЬгеад) зпап(с чо)б Ма(п() ( Рогтч(еи ч)еи = геи Рогеч1еи() 1 Р.езепгег ргезепгег = пси Ргеяеппег(ч(еи) Арр11сатуог . Вип (чуси); Вот собсгвенно и все, паттерн МЧР в своем простейшем варианте перед вами, самое время его обсудить. Хотелось бы более подробно остановиться на интерфейсе 1Ч(еи(, что дает его использование, и почему бы не заменить его на базовый класс, с некоторой примитивной реализацией... Строго говоря, сам паттерн вовсе не обязывает использовать для представления именно интерфейс, но использование здесь именно интерфейса, на мой взгляд, дает ряд преимуществ. Прежде всего, как и завещано создателями упоминавшегося принципа 1оС, подобный подход уменьшает зависимость между классами.

Замена интерфейса на некоторую базовую реализацию привела бы к тому, что изменение базовой реализации могло бы нарушить правильную работу использующего эту реализацию класса, в данном случае Ргезепгег-а. 08.01.12 Мод«И/~ев-Соп!~о8ег в .Н«1 Помимо этого, использование интерфейса дает возможность делать Представление из объектов находящихся на любом уровне уже существующих иерархий, предоставляемых готовыми библиотеками. Например, в вышеприведенном случае, вполне можно было бы сделать базовую реализацию унаследовав ее от Зу81ет.Илдоиероллз, но дело в том, что конкретное Представленйе не обязательно может являться формой, с тем же успехом это может быть и контрол и даже произвольный класс, агрегирующий в себе графические элементы, а наследование от $у81ет.УИлдопароллз жестко впишет базовый класс Представления в уже имеющуюся иерархию, и лишит подобной гибкости.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее