Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс весна 2022 – 11 занятие

Программирование – 1 курс весна 2022 – 11 занятие

ТиМПИ

May 17, 2022
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 2/13 2/13 Что это? Паттерн проектирования — архитектурная конструкция, позволяющая

    решать схожие проблемы в “проектировании”. Чем паттерн проектирования отличается от алгоритма?
  2. 3/13 3/13 Составляющее паттернов • Описание проблемы • Мотивация предлагаемого

    решения • Описание и структура классов • Пример применения (код) • Связи с другими паттернами
  3. 4/13 4/13 История паттернов • Александер К., Исикава С., Силверстайн

    М. Язык шаблонов: города, здания, строительство. – Москва: Изд-во Студии Артемия Лебедева, 2014. – 1093 с. • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы объектно-ориентированного проектирования. Паттерны проектирования.– 2007. [23 паттерна, GoF book]
  4. 5/13 5/13 Зачем нужны паттерны? • Стандартизация кода • Проверенные

    решения • Создание понятной архитектуры Критика: • Костыли для слабого языка • Неэффективные решения («как в книжке») • Неправильное применение (Золотой молоток)
  5. 6/13 6/13 Классификация паттернов • Порождающие паттерны (гибкое создание объектов)

    • Структурные паттерны (способы связи между объектами) • Поведенческие паттерны (коммуникация между объектами) Основная цель изучения паттернов — понять зачем и как применять
  6. 7/13 7/13 Синглтон (порождающий паттерн) Суть: паттерн гарантирует, что у

    класса есть только один экземпляр и глобальная точка доступа Проблема: - Нужен постоянный объект при обращении к классу - Нужна глобальная «защищенная» (от перезаписи) точка доступа Решение: скрыть конструктор класса и реализовать static-метод для управления классом
  7. 8/13 8/13 Синглтон Мотивация: • В программе нужен один экземпляр

    класса • Когда нужен контроль над глобальными переменными Плюсы и минусы: + Гарантирует наличие одного экземпляра класса + Даёт глобальную точку доступа + Отложенная инициализация – Нарушение принципов ООП – Может маскировать плохой дизайн программы – Проблемы с многопоточностью https://bool.dev/blog/detail/pattern-singleton
  8. 9/13 9/13 Синглтон алгоритм 1) Добавить в класс приватное статическое

    поле, которое будет содержать одиночный объект 2) Объявить статический метод для создания одиночки (getInstance()) 3) Добавить в статический метод (getInstance()) создание объекта при первом вызове метода 4) Создать приватный конструктор 5) Заменить вызовы конструктора одиночка вызовами его создающего метода
  9. 10/13 10/13 Мост (структурный паттерн) Суть: разделить классы на абстракцию

    и реализацию Проблема: - Фигур Решение: замена наследования агрегацией или композицией (фигура->цвет или GUI+API)
  10. 11/13 11/13 Мост Мотивация: • Разделить класс, который содержит несколько

    реализаций одной функциональности • Когда класс нужно расширять в двух независимых плоскостях • Когда необходимо изменять во время выполнения программы Плюсы и минусы: + Возможность построения кросс-платформенные программы + Возможность скрыть детали клиентского кода – Сильно усложняет код программы
  11. 12/13 12/13 Мост алгоритм 1) Определить по какому измерению можно

    разделить класс 2) Выделить и описать абстракцию (базовый класс, «фигура») 3) Выделить часть, необходимую абстракции — реализация (общий интерфейс, «цвет фигуры») 4) Под каждую задачу опишите конкретную реализацию (красный цвет, черный цвет и т.д.) 5) Добавьте в класс абстракции ссылку на объект реализации 6) Если у вас есть несколько вариаций абстракции, создайте для каждой из них свой подкласс 7) Подать объект реализации в конструктор абстракции, чтобы связать их воедино. Использовать объект абстракции
  12. 13/13 13/13 Снимок (поведенческий паттерн) Суть: сохранить и восстановить состояния

    объектов Проблема: • создание и откат истории файла • приватность • изменение кода классов копирования Решение: поручить создание копии состояния объекта самому объекту, который этим состоянием владеет
  13. 14/13 14/13 Снимок Мотивация: • Когда нужно сохранить состояние объекта

    • Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию Плюсы и минусы: + Не нарушает инкапсуляции исходного объекта + Исходному объекту не надо хранить свою историю – Требует много памяти – Сложно гарантировать приватность (Python, JS, PHP и др.)
  14. 15/13 15/13 Снимок алгоритм 1) Определить класс создателя 2) Создайте

    класс снимка и опишите поля как у создателя 3) Защитите объект снимка от изменений 4) Сделайте класс снимка вложенным в класс создателя (или создайте интерфейс) 5) Добавьте в класс создателя метод получения снимков 6) Добавьте в класс создателя метод восстановления из снимка
  15. 16/13 16/13 Какие ещё паттерны есть? Порождающие: • Фабричный метод

    • Абстрактная фабрика • Строитель • Прототип Структурные: • Адаптер • Компоновщик • Декоратор • Фасад • Легковес • Заместитель Поведенческие: • Цепочка обязанностей • Команда • Итератор • Состояние