Patterns2015
.pdfФасадуправляетвсемикомподсистемынентамизаклиента |
. Обновление |
компонентовподсистемыотразитсянакодеклиента |
. |
Еслистановитсяемаслишксложной,м ввестимнесколькодополнительных |
|
фасадовдляорганизациилогическихуровней |
. |
4.7 Информационныйэксперт( |
Information Expert) |
|
Проблема |
|
|
Всистемедолжнааккум |
ули,рассчитыватьсяоваться.п.необходиинфор. мация |
|
Решение |
|
|
Назначитьобязанностьаккумуляцииинформации,расчета.п.классу |
|
|
«информационномуэксперту»,обладающемунеобходи. мойацией |
|
|
Результат |
|
|
Преимущество: поддерживаетинкапсуляцию, |
тоестьобъектыиспользуютсвои |
|
собственныеданныедлявыпостлнениязадачвленных |
|
|
Недостатки: нарушеприразделенияципаиеобязаос объекностейовныхсис, емыов таккаклогикаприлосвязигикажениябазойданныхпомещаютсяводинкласс.
51
4.Задания8 кразделу4 |
|
|
СтруктурныепаттерныАдаптер |
,Декоратор,Итератор,Композит |
: |
1. Рассмпроблдекориротрнекоторыхмутьобъектовсистемеанияиз |
|
заданияк |
разделу 3Предложить. реализациюнаосновеДекоратораобъект раторав классов
2.Внести всистемуобъект,неудовлетворяющийтребуемомуинтерфейсу. ИспользАдаптдляеговнватье.дрения
3.Ввестидлякаждогообъексравнительнуювсисеготемехарактеристику (приоритет)
4.Реализоперацс ртватьобъектови,выборкировкивсехобъектов, удовлетворяющихзаданнымусловиямнахарактер.Реалвыполнитьназстикуцию оснКомпозиИтератораве
5.Построитьдиаграммуклассов
52
6. Представитьва расширнтылизациисистемыния
СтруктурныепаттерныМост,Фасад,Информа |
ционныйэксперт,Приспособленец |
: |
1.Рассмотретьпроблемуреализсистемынаразлцииплатформахчных
2.ПостМостдляроитьазделенияабстрре .кциилизации
3.Предстварнескольреиатьконтовлизациинкретныхобъектовнаразных платформах
4. Органисложноевзоватьаимеждубъекдейстамвие |
исистемы,которые |
последовательновключаютсяобщийпроцесс.Оформиведениесистемыь |
|
помощьюФасада. |
|
5.Ввестидляодногоклассавозможнналичиябольшогок стьличестваразнообразных объ.РектовализоватьихповеденспомощьюПриспособленцев.
6.Постродиаграммутьклассов
7.Представитьва расширнтылизациисистемыния
53
5 Порождающиешаблоны |
|
|
|
||
Порождающиешаблоныпозвосделасисняютемузависимойьотспособасоздания, |
|
|
|||
комипредставленияозицииобъектов. |
Онискрывдеталитого,какэтиютклассы |
|
создаются |
||
истыкуются. |
Структураобъексиснеизвестнаемеов. |
Единственнаяинформация |
об |
||
объектах,известнаясистеме |
|
- этоихинтерфейсы,определенныепомощьюабстрактных |
|
|
|
классов. |
|
|
|
|
|
Порождающобеспечивапаттерныбольшугибкостьрешенииювопроса |
|
отом, |
|||
чтосоздается,ктоэтосоздает,какикогда.Можнособрасисизготовых«емуь» |
|
|
|
||
объектовсса |
мойразличнойструктуройфункциональностьюстатическиэтапе( |
|
|
||
компиляции)илид намическиво(времявыполнения). |
|
|
|
||
Порождающиепаттерныпоказ,какс вают |
делатьдизайнболеегибким,хотя |
|
|||
необязательноменьшимпоразмеру.Вчастности,ихпримененменятьпозволлегкоит |
|
|
|
||
классы,определяющиекомпонсист. нтымы |
|
|
|
||
Паттерн,порождающийклассы |
,используетнаследование,чтобыварьировать |
|
|
||
создаваемыйкласс |
|
|
|
|
|
Паттерн,порождающийбъекты |
,делегисозданиедругомуобъет. кту |
|
|
||
Спорождающихисокпаттернов |
|
|
|
||
1. |
Factory |
|
ПростаяФабрика |
|
|
2. |
Factory method |
Фабричныйметод |
|
|
|
3. |
Abstract |
factory |
Абстрактнфабрикая |
|
|
4. |
Builder |
|
Строитель |
|
|
5. |
Prototype |
Прототип |
|
|
|
6. |
Singleton |
|
Одиночка |
|
|
7. |
Object Pool |
Пулобъектов |
|
|
|
Краткийобзор |
(примерслабиринтомMaze) |
|
|
Фабричныйметод . ЕслиCreateMazeвызываетвиртфувместоальныенкции конструкторов длясозданиякомнат,стендверей,тоинстанцируемыеклассыможно подменить,создавподклассMazeGameпереопределивнемвиртфу.Такойальныенкции подходприменяетсявпаттернефабричныйметод;
Абстрактнфабрикая |
. КогдафункцииCreateMazeвкачеств |
епарамперетрадается |
объект,исподсольязкомнатданияуемый,стендверей,тоихклассыможноизменить, передавдругойпараметр.Этопримерпаттернаабстрфабрика. ктная
Строитель. ЕслифункцииCreateMazeпередаетсяобъект,способныйцеликомсоздать
54
зованапротко,мнатыпамидверистены,
-прототидругими.Этопаттернырототип.
Одиночка. Одиночка можетгарантироватьналичиеединственног олабвигреринта свободныйдоступкнемусосторонывсехигровыхобъ,нприбегктовглобальнымя перемеилифу.нкциямным Одинтакжепозволяетчкалегкорасшилзаменитьрить лабиринт,нетрогаясуществующийкод.
5.1 Простаяфабрика
Проблема
Вп рограммесоздаютсяиисп бъектыльзгрвзаимосвязанныхуппютсяклассов,причем классобъектадинамическивыбираетсязависотвыполнениямнекоторыхстиусловий. Появляется код типа:
if (<условие 1>) myObject = new classObj_1(…);
else if f (<условие 2>) myObject = new classObj_2(…); else if f (<условие 3>) myObject = new classObj_3(…);
… |
|
|
|
Недостаткитакойреализациипривнесенииизменений: |
|
||
1 – найтикод(такихп |
озицийвкодеможетбытьмного! |
) |
|
2 – внестиизмнепосренениявнайденныйкодственно |
|
||
Итог: Коднеобходменятьприкаждомимозменениисистемы |
|
||
Пример: |
Доставтраказа комнлиентаотеляту |
|
|
IBreakfast * orderBreakfast(char * name){ |
|
||
|
IBreakfast * breakfast; |
|
|
|
if (strcmp(name,” continent”)) breakfast = new continentBreakfast (); |
||
|
else if (strcmp(name,”english”)) breakfast = new englishBreakfast (); |
||
|
else if (strcmp(name,”american”)) breakfast |
= new amerBreakfast (); |
|
|
breakfast -> |
collect(); |
|
|
breakfast -> |
pack(); |
|
|
|
55 |
|
return breakfast;
}
Чтодела,есливотпоявилсяьеленов ыйтипзавтрака?
Чтоделать,еслинужнооткотамерикансзатьсязавтрака? ого
IBreakfast * orderBreakfast(char * name){
IBreakfast * breakfast;
if (strcmp(name,” continent”)) breakfast = new continentBreakfast (); else if (strcmp(name,”english”)) breakfast = new englishBreakfast (); else if (strcmp(name,”american”)) breakfast = new amerBreakfast ();
breakfast -> collect(); breakfast -> pack(); return breakfast;
} |
В КОД НАДО ВНОСИТЬ |
ИЗМЕНЕНИЯ!
Выделим операциюсозданияобъектавметод |
create()класса Factory |
IBreakfast * orderBreakfast(char * name){
IBreakfast * breakfast;
Factory * factory= new Factory(); breakfast = factory->create(name); breakfast -> collect();
breakfast -> pack(); return breakfast;
}
56
«Нашафабпроизводитикадоспехи,па,л»укиицы
5.2 Фабричныйметод( |
Factory method) |
Проблема
Необходимообеспечитьсозданиеобъек,приэтомовсутствуетинформацияклассе этогообъекта.
Решение
Делегироватьчастьфункцийвспомогательномуклассу.
Результат |
|
|
Строитсяпараллельнаяиерархияклассов,содержащихперегружаемыйф |
абричныйметод |
|
длясозданиясоответствующихэкземпляровклассов |
-продуктов.Созданиеделегируется |
|
подкласс,приэтомскреализациюытамдлядостиженбольшейгибкостиилия |
|
|
возможностирасширенфункциональности. я |
|
|
ОпределениеФабричногометода |
|
|
ШаблонFac |
toryдаетвозможностьMethodобъектуинициироватьсозданиедругого |
|
объекта,ничегонезнклассеяэтогообъекта. |
Шаблиспвослнеслиьзуетсяучаях: |
|
|
|
57 |
1)клзассранеезнает,какиеобън обхктыбудетсоздавать,димо.к. возможнывариеа;нтылизации
2)классспроета,чтоспецификациятированрождаемогобъекта определяетсятольковнаследниках.
3)классвыиделчастьяетегируетсвоихфункцийвспомогательномуклассу.
РеализацияФабричногометода |
|
|
Строитсяпараллельнаяиерархияклассов,содержащихпер |
егружаемыйфабричный |
|
метдлясозданиясоответствующихэкземпляровклассов |
-продуктов. |
Создание |
делегируетсяподкласс,которыереш,какиеобъектымютследуетсоздать. |
|
|
РеализацияФабричногометода |
(1) |
#include <iostream> using namespace std; class Document{ protected:
char * name; int size;
public:
Document(char* n, int s){name = n; size = s;}
virtual void display(){cout<< "My name is "<< name<<"\n";} char * getName(){return name;}
};
58
РеализацияФабричногометода |
(2) |
|
class TXTdocument : public Document{ |
|
|
private: |
|
|
char *data; |
|
|
public: |
|
|
TXTdocument(char* n, int len) : Document(n, len){ |
|
|
data = new char[len+10]; |
data[0] = 0; |
|
} |
|
|
TXTdocument(char* n, char * info) : Document(n, sizeof(info)){ |
||
cout<< "\n new TXTdocument from info " << info <<"\n"; |
int len = strlen(info); |
|
data = new char[len+10]; |
memcpy(data, info, len+1); |
|
}
virtual void display(){
cout<< "\nMy name is "<< name<<"\n"; cout<< "My text:\n"<< data <<"\n";}
};
РеализацияФабричногометода (3)
class JPGdocument : public Document{ private:
char *data; public:
JPGdocument(char* n, char * empty) : Document(n, 200){ data = new char[200];
char picture[] = "\1\1\1\1\1\1\1\1\n\1\1\1\1\1\1\1\1\n"; memcpy( data, picture, strlen(picture) + 1 );
}
virtual void display(){
cout<< "\nMy name is "<< name<<"\n"; cout<< "My picture:\n"<< data <<"\n";}
};
Реализация Фабричного метода (4)
class Object { // Класс Factory method private:
Document * document; public:
Object(){}
//Абстрактный метод, реализуемый наследником, //создаетивозвращаетобъектконкретногодокумента.
virtual Document * createDocument(char * name, char * info) = 0; Document* cloneDocument(Document* a) {
return this->createDocument(a-> getName(), "copy");
}
} ;
59
РеализацияФабричногометода |
(5) |
|
|
class TXTobject : public Object{ |
|
||
public: |
|
|
|
TXTobject() : Object() {} |
|
|
|
virtual TXTdocument * createDocument(char * name, char * info){ |
return new |
||
TXTdocument(name, info); } |
|
|
|
}; |
|
|
|
class JPGobject : public Object{ |
|
||
public: |
|
|
|
JPGobject() : Object() {} |
|
|
|
virtual JPGdocument * createDocument(char * name, char * info){ |
return new |
||
JPGdocument(name, info); } |
|
|
|
}; |
|
|
|
РеализацияФ |
абричногометода( |
6) |
|
int main(){
Object * ft = new TXTobject();
Document *a= ft->createDocument("document1", "this is a very long text");
Document *b= ft->createDocument("doc2","short text"); Document *c= ft->cloneDocument(a);
a->display(); b->display(); c->display();
Object * fg = new JPGobject();
Document * g =fg->createDocument("newPictire",""); g->display();
return 0;
}
Примерработы
60