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

Patterns2015

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

3Заданияк.6 разделу3

1. Рассмотретьзадачувнеформальнойпостановке 2. Перечислитьсписоквозможныхрасширенийпос тановкиза дачино(свые,ойства

действияобъекты, ,взаимодействия..)

3.Сформироватьперечинтеньрфейсов

4.Сформирпереченьклассовихбязанностивать

5.

Делегироватьобязанностиклассам

-делегатам

6.

Построитьдиаграммуклассов

 

7.

Проверитьвыпринциповол изкойение

связностивысокогозацепления.

8.Реализоватьсистему

9.Представитьва расширнтылизациисистемыния

Примерныевариантызадач:

 

1.

СистемапокупоквИ

нтернет-магазине

2.

Игра - лабиринтспрепя,призами,жителямиствиями

3.

Системадоставкизакиспользов

зовсаниеммолетов,автомобилей,поездов

4.Зоопарксразлвиобезьяндамичнымиввольерах,способнучитьсянав, ыхкам плавать,лазитьпокамням,естьбананы.

5.Системавизу ключениялизацииконтнапрактоводуктыпитанияпшеницу( ,с ры

ит.д. )

6.Игра ”Дюна”

7.Танковоесражение

8.Многофункциональныйэлектперонныйеводчик

9.Движениеавтотранспортадорогамгорода

10.Заводпопроизводствукрасокрастворителей

11.Системауправленияучетакомпьютеровсетейкомпании

12.Системабанкомата

13.

Системауправленияавтоматомпо

одажебут рбродов

14.

Системауправлениятемпрежимомавтоматизированнойтурнымтеплице

15.

Системаброн налрованиятетоватрально

-зрелищныепредставления

16.

Системауправленияроботом

-луноходом

31

4 Структуршаблоные

 

 

Списокструшаблоновтурных

:

 

1.

Adapter

Адаптер

 

2.

Decorator

Декораторобъектов(

Wrapper)иликлассов

3.

Composite

Компоновщик

 

4.

Iterator

Итератор

 

5.

Bridge

Мост

 

6.

Flyweight

Приспособленец

 

7.

Facade

Фасад

 

8.

Information Expert

Информационныйэксперт

 

4.1 Адаптер( Adapter)

Проблема

Необходиобеспечитьвзаимодействнесовминтерфилтимыхоздатьейсов единыйустоинтерфейсчивыйдлянескольккомпонентовразинтерфейсамихыми.

Решение

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

Результат

 

 

 

Классыкладаптируентаклассаявляются,немогозависимы

мидруготдруга

Адаптер

можетсобиратьинформациювызываемыхметодах

 

 

 

ПаттеАдаптереобразуинтерфейсуинтерфклассадругомуейс, которым

 

 

работаетклиент. Адаптеробесовместнуюпечивработукл,изначальноетссов

 

 

невозможнуюиз

-занесовмест

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

 

инте,анесреализациейфейсом.Существуетд ада:адаптптеровобъи рктов

 

 

адаптерклассов.

 

 

 

Всезапросыадаптер

делегируетадаптируемомуклассу

 

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

 

 

 

32

Адаптеробъектов

Адаптерклассовтребует( множенаследованиятвенного)

1.Адаптернаследуетинтерфейс, которыйрассчклитываетент

2.Адаптердолжсодссылкунржадаптируемыйтьобъект

3.Адаптердолженреализоватьвсем интерфейсатоды

4. Адаптермаск

ируетазличиявсемантикеметодовинтерфейальногокласса

Дляэтогоадаптерможет

делегироввыполнениеметодаадаптируемомутьклассу

Реализоватьдополнлогдлямаскировкительнуюкуразличийсемантике методовадаптклассаинтруемогорфейса

Фактическисложностьклассаадаптеничемнеограничена

33

Пример№реализации1 адаптера

#include <iostream> using namespace std;

class ITarget { … / интерфейс, который использует main

};

class IndependentClass { … // адаптируемый класс };

class Adapter : public ITarget { … // адаптер, реализующий интерфейс // ITarget

};

int main() {

ITarget *trg = new Adapter();

cout << "Random is: " << trg->functFromITarget() << endl; return 0;

}

class ITarget { // интерфейс, который использует main public:

virtual int getRandomNumber() = 0;

};

// адаптируемый класс, не реализующий ITarget

class IndependentClass {

public:

 

int random() { return 4;

}

};

class Adapter : public ITarget { // адаптер, реализубщий интерфейс ITarget private:

IndependentClass *adp; public:

int getRandomNumber() { cout<< "Call random() \n"; return adp->random(); }

Adapter() { adp = new IndependentClass(); } ~Adapter() { delete adp; }

};

Пример№

2

 

 

Есть класс уток. Классиметодыдлявыпдвухоперацийлнения:крякатьлетать.

Естьготовыйклассиндюшек.Приреалклассаиндюшекзацииинтерфейскл

ассаутокне

использовали.

Индюшкичем

-топохожинауток,нолетаютониплоховместокряканья

издругиеаютзвуки. Впрограммеклассиндолженюшализовыватьтоткжеинтерфейс,которыйреализует

классуток .

34

class IDuck { // интерфейс public:

virtual void quack() = 0; virtual void fly() = 0;

};

class SmallDuck : IDuck { // класс, реализующий интерфейс public:

virtual void quack() {cout << "krja-krja \n"; }

virtual void fly() { cout << "I am flying very quickly \n";}

};

class Turkey { // независимый класс public:

void gobble() {cout << "bo-bo-bo! \n"; } void fly() { cout << "I am flying... I fell. \n";}

};

class Adapter : public IDuck { // Адаптер для Turkey private:

Turkey * myTurkey; public:

virtual void quack() { myTurkey -> gobble(); }

virtual void fly() { for (int i=0; i<4; i++) myTurkey -> fly(); } Adapter (Turkey *t) {myTurkey = t;}

};

int main() {

cout << "\n SmallDuck" << "\n"; SmallDuck * duck = new SmallDuck(); duck -> fly();

duck -> quack();

cout << "\n Turkey" << "\n"; Turkey * turkey = new Turkey();

Adapter * adp = new Adapter(turkey); adp -> fly();

adp -> quack(); return 0;

}

Результат

35

4Декоратор.2 объектовилиОбертка(

Decorator или Wrapper)

Проблема

 

Необходимовозложитьдополнительныеобязанностипрозрачные( дляклиентов)на

 

отдельныйобъ,анаклассктвцелом.Надои итироваинтерфейсуобъекта,ко ьорый

 

таким интерфейсомнеобладает

 

Решение

 

Динамичдобавитьобъобязанностиескивыекту

, неприбегаяэтомкпорождению

подклассов.

 

Результат

 

Большаягибкос,чемустатнаследьическ:можнодогобивудалятьвлятьния

 

обязанностивовремявыпрограолнения

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

наслебылодосоздавванияновыйклдлякаждойсстьдополнительнойобязанности.

 

Данныйпаттернпозволяетизб жатьрегруженныхметодклассовверхнихмиуровнях

 

иерархии - нобязанностивыеможнодобавлятьп

меренеобходимости

Декоратор

 

36

Примердеко атора

37

Реализациядекоратора(1)

#include <iostream> #include <string> using namespace std;

class IMenuItem { // общий интерфейс public:

virtual string getDescription()=0; virtual float getCost()=0;

};

class AdditionalItem : public IMenuItem { // декоратор protected:

IMenuItem *item; public:

virtual string getDescription()=0; virtual float getCost()=0;

AdditionalItem( IMenuItem *inItem ) { item = inItem; } ~AdditionalItem() {}

};

Реализация декоратора (2)

class Tea : public IMenuItem {// конкретны компонент 1 public:

virtual string getDescription() { return string("tea"); } virtual float getCost() { return 3.5; }

};

class Coffee : public IMenuItem {// конкретны компонент 2 public:

virtual string getDescription() { return string("coffee"); } virtual float getCost() { return 4.5; }

};

Реализация декоратора (3)

class Milk : public AdditionalItem {// конкретный декоратор 1 public:

virtual string getDescription() {

return string("milk + ") + item->getDescription();

}

virtual float getCost() {

return 2.5 + item->getCost();

}

Milk( IMenuItem *inItem ) : AdditionalItem(inItem) {}

};

38

Реализация декоратора (4)

class Sugar : public AdditionalItem { // конкретный декоратор 2 public:

virtual string getDescription() {

return string("sugar + ") + item->getDescription();

}

virtual float getCost() { return 0.5 + item->getCost(); } Sugar( IMenuItem *inItem ) :

AdditionalItem(inItem)

{}

void makeMix(){ cout <<"mixed " << item->getDescription() << "\n"; }

};

int main() { Tea t;

cout << t.getDescription() << ", cost: " << t.getCost() << endl; Coffee c;

cout << c.getDescription() << ", cost: " << c.getCost() << endl; Milk m(&c);

cout << m.getDescription() << ", cost: " << m.getCost() << endl; Sugar s(&t);

s.makeMix();

cout << s.getDescription() << ", cost: " << s.getCost() << endl; return 0;

}

Выполнение

39

Адаптеридеко( атор

сравнение)

 

 

Декоратор

 

Адаптер

Задача:

Расширитьповедение

объектов

Задача: Обеспечитьвзаимодействие

иликлассов

 

несовминтерфейсовстимых

Включаетвклассилиобъектновое

 

Преобразутребуемомуинтерфк ейс

поведениебезменения

 

виду.Повнменяетсядение

существующкода.Инт рфегойс

 

 

меняется

 

 

Результат: всуществующийпроект мождобаноповедениевоеитьклассов илиобъиезктовменения существующегокодадекорируемых классов

Результат: можноиспстарыйльзовать кодклассовновомпроектеилиновый кодклассовстапроектем

4.3 Мост( Bridge)

Проблема

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

Решение

Поместитьабстракци юиреализациювотдельныеиерархииклассов

Результат

Отдреализациилеотинтие,торфейса,стьРеализацию" "Абстракции""можно конфигурироватьвовремявыполн.РаздклассовеАбстрнияление" "Ре" а"кциялизация

устранязависимостиотреализации,уст анавливаемыеэтапекомпиляции:чтобы изменитьклассРеализация" "необязатпер льнокомпилироватьклассАб" ".тракция

40

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