Patterns2015
.pdf«О бработканажатийклавиш»
class KeyHandler { protected:
KeyHandler *successor; public:
KeyHandler(){successor = NULL;} KeyHandler(KeyHandler* h) { successor = h; } ~KeyHandler();
virtual void handleKey(int key) = 0;
};
class KeyEnter : public KeyHandler { public:
KeyEnter(){}
KeyEnter(KeyHandler* h) : KeyHandler(h) { } void handleKey(int key) {
if (key == 13)
cout << "Pressed \"Enter\"" << endl; else
if(successor != NULL) successor->handleKey(key);
}
};
class KeySpace : public KeyHandler { public:
KeySpace(){}
KeySpace(KeyHandler* h) : KeyHandler(h) { } void handleKey(int key) {
if (key == 32)
cout << "Pressed \"Space\"" << endl; else
if(successor != NULL) successor->handleKey(key);
}
};
class KeyEsc : public KeyHandler { public:
KeyEsc(){}
KeyEsc(KeyHandler* h) : KeyHandler(h) { } void handleKey(int key) {
if (key == 27)
cout << "Pressed \"Esc\"" << endl; else
if(successor != NULL) successor->handleKey(key);
91
}
};
int main(int argc, char *argv[]) { // создали цепочку:
KeyEnter *kEnter = new KeyEnter(); KeySpace *kSpace = new KeySpace(kEnter); KeyEsc *kEsc = new KeyEsc(kSpace);
do{ kEsc->handleKey(getch());
} while(true);
return 0;
} |
|
Преимущества |
|
Возможностьдинамическогодобавновыхэлецепочкиментовния |
. Каждыйэлемент |
отвечает олькозаоднуобязаиненодругихаетность |
. |
Преимущество-недостаток |
|
Еслиообщениенеобработаоднимобъектом, исчезаетновконцецепочки |
. |
Классприменениечское |
|
Обрасовбсистемеыо каий |
. |
6Посредник.8 ( Mediator)
Проблема
Вполучившей структурепроектамногосвязеймеждубъектами.Необходимообеспечить взаимодействие мнобъектовжества ,сформировавприэтомслабуюсвязанностьизбавив объектыотнеобходимостиявноссылдругдруга.ться
Решение
Создатьобъект |
, инкапсулирующийспос |
обвзаимнодейбъектовже. ствияа |
Результат
УстраняетсясвязанностьмеждуКоллегами" ",централизуетсяуправление.
Изменениесвязей
92
Диаграммаклассов
6.9 Стратегия( |
Strategy) |
|
Проблема |
|
|
Спроектироватьвзаимознадежлгормеилинстрыеятмымые |
атегии.позволяющие, |
|
выпмолнятьдификациюалгоритмбезмененийнастклиентаовроне |
. |
Решение
Опредедлякаждгоритмал стратегиитьлиотдельныйкласссостандартным интерфейсом.
93
class Strategy { public:
Strategy(void){}
~Strategy(void){}
virtual void sort(vector<int> &arr) = 0;
};
class Bubble_Sort_Strategy: public Strategy { public:
Bubble_Sort_Strategy(){} ~Bubble_Sort_Strategy(){} void sort(vector<int> &arr) {
int tmp;
for(vector<int>::iterator i = arr.begin(); i != arr.end(); i++) for(vector<int>::iterator j = i+1; j != arr.end(); j++)
if ( (*i) < (*j)) { tmp = *I; *i = *j; *j=tmp; }
}
};
class Context { protected:
Strategy* operation; public:
Context(void){}
~Context(void){}
virtual void UseStrategy(vector<int> &arr) = 0; virtual void SetStrategy(Strategy* v) = 0;
};
class Client: public Context { public:
Client(void){}
~Client(void){}
void UseStrategy(vector<int> &arr) { operation->sort(arr);
}
void SetStrategy(Strategy* o) { operation = o; }
};
94
int main(int argc, char *argv[]) { vector<int> data(10); <Создаем массив>
Client *client = new Client(); Bubble_Sort_Strategy *bubl_sort =
new Bubble_Sort_Strategy(); client->SetStrategy(bubl_sort); client->UseStrategy(data);
for(vector<int>::iterator i = data.begin(); i != data.end(); i++) cout << *i << " “;
cout << endl; return 0;
} |
|
Преимущества |
|
• Можноизбавитьсяотусловноператорпривыборенужногоховедения |
. |
• Инкапсуляциякаждалгвоготдельныйритмакласспо |
зволяизмегонезависимонять. |
Недостатки |
|
• Клиентдолжензнатьвсехтратег,ихпреинедостаткахмуществахях,чтобы |
|
квалифицивыбратьнужнуюст ованноатегию |
. |
• Алгоритмынельзязамединитьамически |
. |
6.10 Интерпретатор( |
Interpreter) |
|
Проблема |
|
|
Имеевстречающаясячас о, |
подверженизменениаям |
задача,котмобытьраяжет |
промодввидекулиграмматикисивова. ной |
|
|
Решение |
|
|
Создатьинтерпрет,которыйрешданнуюзадачуеттор. |
|
|
95
6.11 Шаблонныйметод( |
Template Method) |
|
Проблема |
|
|
Определреализоватьалгори итвозможпереопределенияостьекото |
рыхшагов |
|
алгоритмадляподклбез( мененияобщейсструктурыовалгоритма |
|
). |
Решение
"АбстрактныйКл"определяабстрактныеОп(),замещаемыевцииссконкретных подклдляреашссахлизациилгоргов,реализуетШаблонныйМетодтма(), опредескел" яющий ет"алгоритма.Конк" "релизуететныйКлассОперации(),выполняющие шагиалгоритмаспособ,которыйзависитподклассам.КонкретныйКл" "предполаг, аетсс чтоинвариантныешагиалгоритмабудутвыполненыАбстрактномКлассе" ".
6.12 Контроллер( Controller)
Обязанносистемныхпообработкесообщд лспецигируютсянийкл.альномуссу Контроллер - этообъект,которыйотвечаетзаобработкусистемныхсобытийнеотносится кинтерфейсупользоват.Контроопрметодыллереляетвыполнсистемныхния операций.
6.13 Искусственный (Pure Fabrication) |
|
Присвоитьгруппуобязанностейвысокойстепеньюзацепленияклассу,которыйне |
|
представлконкретнпонизпредметнойятияоблассинтезироватьго( искусственную |
|
сущностьдляобеспечениявысокогозацепления |
слабогосвязывания). |
96
Даннымпаттерннеследуетзлоупотреблятьм |
, иначевсефункциисистпревмывратятся |
объекты. |
|
6.14 Неразговаривайтеснеизвестными( |
Don't talk to strangers) |
Обеспечитьсвязьклиентсобъекпрямымиобътаоготое(ксизветамиь |
стными |
другимобъектам,несамомуклиенту)Обеспечивает. устойчивостьсистемыкизменению |
|
структурыобьектов. |
|
Необходимоизбегатьпрорешенийктных,предпередачуолагсообщенийющих |
|
удалнепрямыминнымиобъектаминезнакомцами( )Решением. можетбытьч |
астныйслучай |
паттернаУстойчивый" кизменениям"Прямы. объектпотребуютсяоперациимвые. |
|
6.15 Заданиякразделу6 |
|
|
ПаттерныСостояХранитель, ,Наблюдатель |
: |
|
1. Рассмпроблтремуть |
работысистемы,основаннойна делениисостояния |
. |
2.Реализовать сохранениеобъектов.
3.Внестивсистемуобъект,которыйследитзасоссистемыоянием.
97
4.Построитьдиаграммуклассов
5.Представитьва расширнтылизациисистемыния
|
ПаттерныКоманда,Перенаправл,Посетительние |
: |
1. |
Реализобрабок каквмареакциютнкуьдейс |
твияпользователя |
2. |
Разорватьизлишнююсвязьмеждуклассиспутемамитемыперенаправления |
|
3. |
Внестивсистемуобъект,который |
посещает объекты системы длявывода |
|
информацииизмененияхихсостояниявзависимостиотусловий |
|
4.Построитьдиаграммуклассов
5.Представитьваре расширнтылизациисистемыния
ПаттерныЦепочкаобязанностей,Посредник,Стратегия |
: |
1.Реалиобрзаовапросовбообъектамицепочкекуь
2.Разорватьизлишнююсвязьмеждуклассиспутемамитемысозданияпосредника
3. Реализовразличныестратегь |
ииработысистемы,исходяизвнутреннегосостояния |
действийпользователя |
|
4.Построитьдиаграммуклассов
5.Представитьва расширнтылизациисистемыния
98
7Концепция |
MVC |
|
|
Название |
MVC – этоаббревиатура: Modelмодель), ( |
Viewпредставление) ( |
, Controller |
(контроллер). |
|
|
|
Model-view-controller - схемаиспользнескшаблованпрлькоиектированиянов,сх помкотмодельщьюданныхрыхприл,пользовательскийжентерфейся взаимспользовдейсразделенынатовтидельныхколемтак,понентачто модификацияоднизкомпонегоказыминвтовимальноеаетоздействиенаостальные.
Этотшаблонразделяетработуприлнатриотдельныеженияфункциональныероли: модельданных(model),пользовательскийинтерфейс(view)управляющуюлогику
(controller).
Такимобра зом,изменен,вносодизкомпонемыея,оказываютминимальнотов возможноевоздействиенадругиекомпоненты.
Модельнезависитотпредставленияилиуправляющейлогики,чтоделаетвозможным проектированиемодкаклизависимогокомпонента,например, создаватьнесколько представлоднойлямод. енлий
7Классический.1 MVC
Модель |
|
Модельисподоступаьзуетсяиманипулированияданными,являетсяпосредником |
|
междупредставлениконтролл. ером |
|
Крважнчертоййнем являетсяделито,чтониа |
меетникакихзнанийотом,что |
происхданнымитвконтпроллереедставлении. |
|
Модельникнедолжнаделатьгдаилиожидатькаких |
-либозапросов/издругих |
компонентов. |
|
99
Модель — этонечтовродепропункданнымгоск.Мтаовбольшинстведельслучае |
в |
являетсясамслочастьюжнойсистемы. |
|
Представление
Представление — это,гданные,полученныеотмодели,вывнужномодятсявиде.
Предстакжеотвавлениезаполуччад йствийотпользователяниестем |
, чтобы |
отправитьихконтроллеру.Например, |
представлениеотображаеткнопкупользовательском |
интерфейсе,апослееёнажатиявызываетсоот |
ветствующконтроллердействи. е |
Крважпойне,чтодляиматьтого,чтобыполучитьправильнуюMVC |
-архитектуру,не |
должнобытьникакихпрямыхвзаи одействий |
ждупредставлениямимоделями.Вся |
логикаобменаданнымеждунидолжнамибытьреализованаконтроллерах. |
|
Возможныдвариеа:лизациинта |
|
-ПредставлениереализосоотпаттерноманоетствииНаблюдатель« »
- Мотдаетдельданныеконтроллеру,которыйп |
ередаетихпредставлению |
. |
Контроллер |
|
|
Задачейконтролявляетсяполученпользоватеданныхераот иманипуляция |
|
|
моделью.Имекон,иноторолонлько,явтерчастьюяетсяйсистемы,которая |
|
|
взаимсподействульзователем |
. |
|
Контроллачинаетсвоюрабор |
утольковрезультатевзаимодействияпользователя |
|
представлени,которвызываоответствуфункцитмконтроллерающую |
|
. |
«MVC – этокаквыдачазамужпринцессы.Модель |
– этоцарство,принцесса |
– его |
представ.Акоролениеь |
– ееконтроллер» |
|
100