Содержание
- 2. Компоновщик Суть паттерна. Компоновщик — это структурный паттерн проектирования, который позволяет сгруппировать множество объектов в древовидную
- 3. Если решать задачу в лоб, то вам потребуется открыть все коробки заказа, перебрать все продукты и
- 4. Решение. Компоновщик предлагает рассматривать Продукт и Коробку через единый интерфейс с общим методом получения стоимости. Продукт
- 5. Для военной стратегической игры ”Пунические войны ”, описывающей военное противостояние между Римом и Карфагеном, каждая боевая
- 6. #include #include // Component class Unit{ public: virtual int getStrength() = 0; virtual void addUnit(Unit* p)
- 7. // Composite class CompositeUnit: public Unit { public: int getStrength() { int total = 0; for(int
- 8. // Вспомогательная функция для создания легиона CompositeUnit* createLegion(){ // Римский легион содержит: CompositeUnit* legion = new
- 9. Применимость Когда вам нужно представить древовидную структуру объектов. Паттерн Компоновщик предлагает хранить в составных объектах ссылки
- 10. Преимущества и недостатки «+»: Упрощает архитектуру клиента при работе со сложным деревом компонентов. Облегчает добавление новых
- 11. Декоратор Суть паттерна. Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность,
- 12. В какой-то момент стало понятно, что одних email-оповещений пользователям мало. Некоторые из них хотели бы получать
- 13. Но затем кто-то резонно спросил, почему нельзя выбрать несколько типов оповещений сразу? Ведь если вдруг в
- 14. Решение. Наследование — это первое, что приходит в голову многим программистам, когда нужно расширить какое-то существующее
- 15. Одним из способов обойти эти проблемы является механизм композиции. Это когда один объект содержит ссылку на
- 16. #include #include class IComponent { public: virtual void operation() = 0; virtual ~IComponent(){} }; class Component
- 17. class DecoratorOne : public IComponent { std::shared_ptr m_component; public: DecoratorOne(IComponent* component): m_component(component) {} virtual void operation()
- 18. int main() { DecoratorTwo obj(new DecoratorOne(new Component())); obj.operation(); // prints "Hello, World!\n" return 0; }
- 19. Применимость Когда вам нужно добавлять обязанности объектам на лету, незаметно для кода, который их использует. Объекты
- 20. Преимущества и недостатки «+»: Большая гибкость, чем у наследования. Позволяет добавлять обязанности на лету. Можно добавлять
- 21. Заместитель Суть паттерна. Заместитель — это структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные
- 22. Мы могли бы создавать этот объект не в самом начале программы, а только тогда, когда он
- 23. Решение. Паттерн Заместитель предлагает создать новый класс-дублёр, имеющий тот же интерфейс, что и оригинальный служебный объект.
- 24. /**"Subject" */ class IMath { public: virtual double add(double, double) = 0; virtual double sub(double, double)
- 25. /*"Proxy Object“*/ class MathProxy : public IMath { public: MathProxy() { math = new Math(); }
- 26. #include using std::cout; using std::endl; int main() { // Create math proxy IMath *proxy = new
- 27. Применимость Ленивая инициализация (виртуальный прокси). Когда у вас есть тяжёлый объект, грузящий данные из файловой системы
- 28. Логирование запросов (логирующий прокси). Когда требуется хранить историю обращений к сервисному объекту. Заместитель может сохранять историю
- 29. Преимущества и недостатки «+»: Позволяет контролировать сервисный объект незаметно для клиента. Может работать, даже если сервисный
- 30. Поведенческие паттерны Паттерны поведения рассматривают вопросы о связях между объектами и распределением обязанностей между ними. Для
- 31. Цепочка Обязанностей (Chain Of Responsibilities) Команда (Command) Итератор (Iterator) Посредник (Mediator) Хранитель (Memento) Объект Null (Null
- 32. Итератор Суть паттерна. Итератор — это поведенческий паттерн проектирования, который даёт возможность последовательно обходить элементы составных
- 33. Но как бы ни была структурирована коллекция, пользователь должен иметь возможность последовательно обходить её элементы, чтобы
- 34. Решение. Идея паттерна Итератор состоит в том, чтобы вынести поведение обхода коллекции из самой коллекции в
- 35. class Stack{ int items[10]; int sp; public: friend class StackIter; Stack() { sp = - 1;
- 36. class StackIter { const Stack &stk; int index; public: StackIter(const Stack &s): stk(s) { index =
- 37. bool operator == (const Stack &l, const Stack &r) { StackIter itl(l), itr(r); for (; itl();
- 38. Применимость Когда у вас есть сложная структура данных, и вы хотите скрыть от клиента детали её
- 39. Преимущества и недостатки «+»: Упрощает классы хранения данных. Позволяет реализовать различные способы обхода структуры данных. Позволяет
- 40. Шаблонный метод Суть паттерна. Шаблонный метод — это поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая
- 41. Проблема. Вы пишете программу для дата-майнинга в офисных документах. Пользователи будут загружать в неё документы в
- 42. В какой-то момент вы заметили, что код всех трёх классов обработки документов хоть и отличается в
- 43. Решение. Паттерн Шаблонный метод предлагает разбить алгоритм на последовательность шагов, описать эти шаги в отдельных методах
- 44. Стандартизуйте основу алгоритма в шаблонном методе базового класса. Для шагов, требующих особенной реализации, определите "замещающие" методы.
- 45. class Base{ void a() { cout void c() { cout void e() { cout // 2.
- 46. class One: public Base{ // 3. Производные классы реализуют "замещающие" методы. /*virtual*/void ph1() { cout }
- 47. int main() { Base *array[] = { &One(), &Two() }; for (int i = 0; i
- 48. Применимость Когда подклассы должны расширять базовый алгоритм, не меняя его структуры. Шаблонный метод позволяет подклассам расширять
- 50. Скачать презентацию