Share
Embed
Transcript
17 slides
-
17 мая 2022 [email protected] Олисеенко Валерий Дмитриевич Ассистент кафедры информатики
Паттерны проектирования -
2/13 2/13 Что это? Паттерн проектирования — архитектурная конструкция, позволяющая
решать схожие проблемы в “проектировании”. Чем паттерн проектирования отличается от алгоритма? -
3/13 3/13 Составляющее паттернов • Описание проблемы • Мотивация предлагаемого
решения • Описание и структура классов • Пример применения (код) • Связи с другими паттернами -
4/13 4/13 История паттернов • Александер К., Исикава С., Силверстайн
М. Язык шаблонов: города, здания, строительство. – Москва: Изд-во Студии Артемия Лебедева, 2014. – 1093 с. • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы объектно-ориентированного проектирования. Паттерны проектирования.– 2007. [23 паттерна, GoF book] -
5/13 5/13 Зачем нужны паттерны? • Стандартизация кода • Проверенные
решения • Создание понятной архитектуры Критика: • Костыли для слабого языка • Неэффективные решения («как в книжке») • Неправильное применение (Золотой молоток) -
6/13 6/13 Классификация паттернов • Порождающие паттерны (гибкое создание объектов)
• Структурные паттерны (способы связи между объектами) • Поведенческие паттерны (коммуникация между объектами) Основная цель изучения паттернов — понять зачем и как применять -
7/13 7/13 Синглтон (порождающий паттерн) Суть: паттерн гарантирует, что у
класса есть только один экземпляр и глобальная точка доступа Проблема: - Нужен постоянный объект при обращении к классу - Нужна глобальная «защищенная» (от перезаписи) точка доступа Решение: скрыть конструктор класса и реализовать static-метод для управления классом -
8/13 8/13 Синглтон Мотивация: • В программе нужен один экземпляр
класса • Когда нужен контроль над глобальными переменными Плюсы и минусы: + Гарантирует наличие одного экземпляра класса + Даёт глобальную точку доступа + Отложенная инициализация – Нарушение принципов ООП – Может маскировать плохой дизайн программы – Проблемы с многопоточностью https://bool.dev/blog/detail/pattern-singleton -
9/13 9/13 Синглтон алгоритм 1) Добавить в класс приватное статическое
поле, которое будет содержать одиночный объект 2) Объявить статический метод для создания одиночки (getInstance()) 3) Добавить в статический метод (getInstance()) создание объекта при первом вызове метода 4) Создать приватный конструктор 5) Заменить вызовы конструктора одиночка вызовами его создающего метода -
10/13 10/13 Мост (структурный паттерн) Суть: разделить классы на абстракцию
и реализацию Проблема: - Фигур Решение: замена наследования агрегацией или композицией (фигура->цвет или GUI+API) -
11/13 11/13 Мост Мотивация: • Разделить класс, который содержит несколько
реализаций одной функциональности • Когда класс нужно расширять в двух независимых плоскостях • Когда необходимо изменять во время выполнения программы Плюсы и минусы: + Возможность построения кросс-платформенные программы + Возможность скрыть детали клиентского кода – Сильно усложняет код программы -
12/13 12/13 Мост алгоритм 1) Определить по какому измерению можно
разделить класс 2) Выделить и описать абстракцию (базовый класс, «фигура») 3) Выделить часть, необходимую абстракции — реализация (общий интерфейс, «цвет фигуры») 4) Под каждую задачу опишите конкретную реализацию (красный цвет, черный цвет и т.д.) 5) Добавьте в класс абстракции ссылку на объект реализации 6) Если у вас есть несколько вариаций абстракции, создайте для каждой из них свой подкласс 7) Подать объект реализации в конструктор абстракции, чтобы связать их воедино. Использовать объект абстракции -
13/13 13/13 Снимок (поведенческий паттерн) Суть: сохранить и восстановить состояния
объектов Проблема: • создание и откат истории файла • приватность • изменение кода классов копирования Решение: поручить создание копии состояния объекта самому объекту, который этим состоянием владеет -
14/13 14/13 Снимок Мотивация: • Когда нужно сохранить состояние объекта
• Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию Плюсы и минусы: + Не нарушает инкапсуляции исходного объекта + Исходному объекту не надо хранить свою историю – Требует много памяти – Сложно гарантировать приватность (Python, JS, PHP и др.) -
15/13 15/13 Снимок алгоритм 1) Определить класс создателя 2) Создайте
класс снимка и опишите поля как у создателя 3) Защитите объект снимка от изменений 4) Сделайте класс снимка вложенным в класс создателя (или создайте интерфейс) 5) Добавьте в класс создателя метод получения снимков 6) Добавьте в класс создателя метод восстановления из снимка -
16/13 16/13 Какие ещё паттерны есть? Порождающие: • Фабричный метод
• Абстрактная фабрика • Строитель • Прототип Структурные: • Адаптер • Компоновщик • Декоратор • Фасад • Легковес • Заместитель Поведенческие: • Цепочка обязанностей • Команда • Итератор • Состояние -
17 мая 2022 [email protected] Олисеенко Валерий Дмитриевич Ассистент кафедры информатики
Паттерны проектирования