Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Patterns2015

.pdf
Скачиваний:
10
Добавлен:
14.02.2015
Размер:
42.45 Mб
Скачать

Фасадуправляетвсемикомподсистемынентамизаклиента

. Обновление

компонентовподсистемыотразитсянакодеклиента

.

Еслистановитсяемаслишксложной,м ввестимнесколькодополнительных

 

фасадовдляорганизациилогическихуровней

.

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

новыйлабиринтспомсвоихщьюперацийдлядобавлкомнат,дверистния,можноей воспользоватьсянаследованиемдляизменениячастейлабиринтаилиспособаего постр.Такойпрендходивпатменяетсяроительерне.
Прототип. ЕслиCreateMazeпараметри которыеоназатемкопируетдобавляетлабиринту,тосоставможнота варьир,замеоднбъектыватьияя

зованапротко,мнатыпамидверистены,

-прототидругими.Этопаттернырототип.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]