Patterns2015
.pdf3Заданияк.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