Patterns2015
.pdfЛинияжизни MVC
ПолныйциклработыMVC
1.Приинициализпредстпользоваоновленияцииобращакмодтелелитсям устанавливаесоотекущимветссоствиисяо.яниемдели
2.Пользовательнажимакнопку.Представлениеотправляетсоответствующую комаконтроллеруду
3.Контроллеринтерпретирукомандуиз еняодель. ет
4.Представлрегистрируетзмоделинвсоответениеновымствииоянием модели
101
Задача |
|
Посистемутроитьуправлениякондиционером.Естьдве, которыхасоли |
|
отображаетсятекущаятемпература. |
Консольможетпередупрсигналтьвляющий: |
Независимооттекущейтемпервыдсигналповтурыеттемшениенапятьературы |
|
градусов, |
|
Взависимоттемпоеруправляющийстидеттурысигналувеличитьуменьшить |
|
темпнасеграмь. тдусовру |
|
Решение |
|
Управляющийсигналпередамодчерезодинизлитсядвухконтроллеров: |
|
- Контпеупролледасигналевляющмоделртбезмененияй |
|
- Контроллерумножаетуправляющийсигнал2перемодели. ает |
|
Кондицивсегдавыпуправляющееонерлняетвоздействиесообща т |
представлениямоб |
изменениях. |
|
Модель |
|
classкондиционерModel{ // private:
View * view[MAXVIEW];какнаблюдатели // View int viewCount;
int temperature; // температура в помещении
public:
102
Model() { viewCount = 0; temperature = 0; } ~Model(){}
void update();
void attache(View *v);
void modelCommandPlus(int data) {temperature += data; update();} void modelCommandMinus(int data) temperature -= data; update();}
};
Представление
classинтерфейсViewпредставления{ // protected:
Controller * c;
int curTemperature; public:
View() {c = 0; } ~View(){}
virtual void attache(Controller * contr){c = contr;} virtual void show(int temperature) = 0;
virtual void edit() = 0;
};
Контроллер (1)
class Controller{ protected:
Modelуправляемая*модельmodel; //
Viewпредставление* view; //
public:
virtual void editFromView (int data) = 0; Controller(Model * m, View * v); ~Controller(){}
103
};
Controller::Controller(Model * m, View * v){ model = m;
view = v;
view -> attache(this); // подключить представление model -> attache(v);подключитьнаблюдателя//
}
Контроллер (2)
class Controller2 : Controller{ public:
//умнпоступившую2ожаеткоман дуот
//представления
void editFromView(int data) {
if (data > 0 ) model->modelCommandPlus( data*2); else model->modelCommandMinus(-data*2);
}
Controller2(Model * m, View *v):Controller( m, v){ } ~Controller2(){}
};
Представление (1)
class View1 : public View { //имееткнопкуповышениятемпературы
public:
View1(){}
~View1(){}
void show(int temperature) {
cout << "View 1: " << temperature << endl; curTemperature = temperature;
104
}
void edit() { c->editFromView(5); }
};
Представление (2)
class View2 : public View { //имеетумную" "кнопкуизмтенениямпературы
public: View2() {} ~View2(){}
void show(int temperature) {
cout << " View 2: " << temperature << endl; curTemperature = temperature;
}
void edit(){
if (curTemperature > 30 ) c->editFromView( -7); else c->editFromView( +7);
}
}; |
|
Main |
|
int main(int argc, char *argv[]) |
{ |
Model *model = new Model(); |
|
View1 *v1 = new View1(); |
|
View2 *v2 = new View2(); |
|
Controller1 * contr1 = new |
Controller1(model,v1); |
Controller2 * contr2 = new Controller2(model,v2); |
|
for (int i=0; i<7; i++) { |
|
v1-> edit(); v1-> edit(); |
v2-> edit(); |
cout << endl; |
|
105
}
return 0;
}
Результат
MVC – основапроектиртрехуровневойм приложенияделива |
|
|
Уровеньпредставления |
отвечаетзаотображениеданных,обеспечеобратсвязинойие |
|
пользователем,сбпорльзовательскийинформации,котопе уровеедаетсяаябизнесь |
- |
|
логики. |
|
|
Бизнес-уровень обеспечлогикувза првамодействиядставленияданных.ВMVC |
|
|
бизнес-уровеньреализуетструктурумодели. |
|
|
Уровеньданных |
отвечазаполуч,передачут ние |
исохранениеданныхвфайл,баз |
данных,службеилиXML |
|
|
106
7.2 Понятиефреймв |
|
орка |
|
|
|
|
Паттерн MVC относитсякархитектурнымпаттернам,. |
|
|
е.определяетархитектуру |
|
||
приложения.Вэтомслучае, реализуемысвоюсистемуненуля,лишьреализуя |
|
|
|
|
||
необходимыеклас |
сыархитектурногопаттерна. |
|
|
|
|
|
Фрейморк (framework) – это наборужереализованныхклассовкомпонентов( ), |
|
|
||||
использованикоторыхреализуетсяготовоеприложения,путем |
|
|
следованияопределенным |
|||
интерфейсам. |
|
|
|
|
|
|
Важноеотличиебиблиотекиклассов |
|
– |
библиотекукл |
ассоввызываетнашкод.А |
в |
|
случаефреймво |
рка нашкодявляетсявызываемым |
|
. |
|
|
|
Совремсист,включающиенныемыинт р |
|
фейс,данныеивзаимодействие |
с |
|||
пользователем,реализуются |
припомощи |
производныеотконцепцииMVCфреймво |
|
рков. |
||
Однимизпервых |
|
MVC фреймворковбыл |
web-фреймворк Ruby on |
Rails,далее |
||
последовалиZendSymfonyдляязыкаPHP,дляJava,Spring |
|
|
ASP.NET MVC идругие , |
|||
полностьюизменившиеподходкразраб,поднявегобъектнотке |
|
|
-ориентированныйуровень |
|||
иотделпредставлениялогику |
. |
|
|
|
|
7.3 MVVM |
|
|
|
|
|
|
|
|
|
Шаблон Model-View-ViewModel (MVVM) — модификацияшаблона |
|
MVC. MVVM |
|||||||
ориентированнасовреалменныебибкзациил.иотекассов |
|
|
|
|
|
|
|
|
|
MVVM, каки MVC, |
исподотделенияьзуется |
|
моделиот |
еёпредставлен ия,что |
|||||
необходимодляразработкимодиф кации |
|
|
ихотдельно |
друготдруга. |
|
Например, |
|||
разреализуетабоработчикгику, ы |
|
|
а специалистпоUI |
- |
пользовательскийинтерфейс |
. |
|||
MVVM используется вместоклассического |
MVC втехслучаях,когда |
|
вфреймворке , |
||||||
которыйегореализует |
|
(например, WPF, |
Cocoa), используетсяконц |
епцияdata |
-binding-аили |
||||
привязкиданных |
. |
|
|
|
|
|
|
|
|
Концепция привязкиданных |
позволяет связыватьданныевизуальнымиэлементами |
|
|
|
|||||
обестороны. |
Этооченьудоб,ведьнамнеадовэтслучаеустамзнавливатьчения |
|
|
|
|
|
|
||
элем,следитьзаизменениемнтов |
|
данныхвкомп |
|
онентеиобновмод,следитьзаятьль |
|
|
|
||
изменениеммоделиобнкомвлять.Дпостаточнопростоненты |
|
|
|
|
|
“прибиндить” |
некоторое |
||
свойствовизуальнкомпонентасв йствубъектуго,поддерживающемуданныхивязку. |
|
|
|
|
|
|
|
||
Прииспользованиитакого |
|
приеприменениеаодели |
|
|
MVC |
становится |
|||
нецелесообразным из-затого,чтопривязкаданныхпредставлениюнапрямуюне |
|
|
|
|
|
|
|||
укладываетсяконцепцию |
|
MVC. |
|
|
|
|
|
|
|
Паттерн MVVM состоитизтрехчастей |
: |
|
|
|
|
|
|
107
• |
Модель (Model) представлясобойданныет |
иоперациипоихбработке. |
|
||||
• |
Представление( |
View) — это интерфейс пользователя,тоестьо,кноит.дпки |
. |
||||
|
Представление |
подписываетсянасобытия |
изменениясвойствиликоманд, |
|
|||
|
предоставМодепредставления.ьюяемых |
|
Вслучае, |
есливМодпрелидставления |
|
||
|
меняется какое-либосв,тоонайстоповсподпиещаетх |
|
|
счикобэт,иомв |
|
||
|
Представление запрашиваетизмененное |
значениесвойстваизМодпрелидставления. |
|
||||
|
Вслучае,еслипользоввоздействуетнкакойтель |
|
|
-либоэлементинтерфейса |
итем |
||
|
образомменяетданные |
|
,Представлениевызываетсоответствующуюкоманду, |
|
|
|
|
|
предоставленную Модельюпредставления |
дляобновлмоделиня |
. |
|
|||
• |
Модпредставленияль( |
ViewModel) этоиабстракция |
|
Представления, |
иобе ртка |
||
|
данныхизМодели,котп рыедлежат |
|
|
привязке. |
Тоесть |
онасодержитМодель, |
|
|
котораяпреобПредстазов,такжесодвлениюнарж |
|
|
|
итвсебекоманды,кото |
рые |
используются Представлением,чтобывлиятьнаМодель.
108
Списрекомендуемойлитературы |
|
|
|
|
|
|
1. |
ГаммаЭ.Хел, |
мР.Джонсон, Р.Влиссидес, . |
Приемыобъектно |
-ориентированного |
||
|
проекти.Паттерныроектированияя. |
— С:П,итерб2015 |
|
. |
|
|
2. |
Э.Фримен,К.Сьерра,Б.Бейтс |
. Паттерныпроектирования |
— С:П,итерб2011 |
. |
||
3. |
Р.Мартин.Чистыйкод.Создрефакторинге,аниализ |
|
— С:П,итерб2010 |
. |
4.Craig Larman. Applyin Craig Larman g UML and Patterns: An Introduction to ObjectOriented Analysis and Design and Iterative Development (3rd Edition) Hardcover – October 30, 2004.
109