Страница курса Паттерны проектирования
Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.
Паттерн проектирования состоит из четырех элементов.
- Имя.Обращаясь к паттерну по имени, можно вести обсуждение с коллегами, упоминать паттерны в документации.
- Задача. Описание того, когда следует применять паттерн. Может описываться конкретная проблема, при решении которой уместно использовать паттерн.
- Решение.Описание классов и объектов, связей между ними.
- Результаты. Преимущества и недостатки данного паттерна. Влияние на степень гибкости, расширяемости и переносимости всей системы.
- Название и классификация паттерна
- Назначение
- Известен также под именем
- Мотивация (описание)
Какие недостатки есть у существующих решений и как паттерн помогает их решать.
- Использование
Ситуации, в которых уместно использовать данный паттерн.
- Структура
Диаграмма классов паттерна. Возможно, диаграмма последовательности.
- Участники
Классы и объекты и их методы
- Отношения
Взаимодействие классов и объектов
- Результаты (достоинства и недостатки)
Результаты применения, компромиссы. Какие аспекты поведения системы можно независимо изменять, используя данный паттерн.
- Реализация
Сложности реализации, зависимость от используемых языков программирования
- Пример кода
- Известные применения
- Родственные паттерны
- Упаковка параметров
- Делегирование
- Итератор
- Выполнение операции для элементов полиморфного контейнера
Каталог основных паттернов
Порождающие паттерны MazeGameMazeGame - общий пример для порождающих паттернов Абстрактная фабрика, Строитель, Фабричный метод, Прототип.
Абстрактная фабрика (Abstract Factory)Предоставляет интерфейс для создания компонентов системы.
Строитель (Builder)Предоставляет интерфейс для создания частей сложного объекта и возвращения сконструированного объекта.
Фабричный метод (Factory Method)Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
Прототип (Prototype)Облегчает динамическое создание путем определения классов, объекты которых могут создавать свои дубликаты.
Одиночка (Singleton)Обеспечивает наличие в системе только одного экземпляра заданного класса, предоставляет доступ к этому экземпляру.
Пул объектов (Object Pool)Обеспечивает интерфейс для работы с набором инициализированных и готовых к использованию объектов.
Отложенная инициализация (Lazy Initialization)Объект, инициализируемый во время первого обращения к нему.
Структурные паттерны Адаптер (Adapter)Адаптирует интерфейс одного класса к другому.
Мост (Bridge)Позволяет менять интерфейс и реализацию независимо друг от друга.
Компоновщик (Composite)Объединяет объекты в древовидные структуры. Единообразно трактует простые и составные объекты.
Пример. Графические фигуры - это окружность, квадрат, отрезок и СоставнаяФигура, которая состоит из других фигур, в то же время являясь фигурой.
Декоратор (Decorator)Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения).
Фасад (Facade)Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
Приспособленец (Flyweight)Уменьшает количество объектов системы с многочисленными низкоуровневыми особенностями путем совместного использования подобных объектов.
Заместитель (Proxy)Заместитель ведет себя точно так же как и основной объект, выполняя при необходимости его инстанцирование.
Паттерны поведения Цепочка обязанностей (Chain of Responsibility)Некий запрос должен быть обработан в цепочке взаимосвязанных объектов (список, дерево - движение от листьев к корню). Объект либо обрабатывает запрос, либо передвает по цепочке следующему объекту. Если ни один из объектов не обработал запрос, то может происходить какое-то действие.
Команда (Command)Упаковка действий в объекты с целью сделать откат изменений (Redo), логирование, комбинирование действий.
Посредник (Mediator)В большой системе с множеством объектов каждый объект может передавать сообщения другому. В результате этого сильно возрастает количество связей между объектами (n^2).
Вместо этого предлагается завести объект-посредник, через который передавать эти сообщения (n связей)
Хранитель (Memento)Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
Null ObjectПредотвращает нулевые указатели, предоставляя объект «по умолчанию».
Наблюдатель (Observer)Другое имя: Издатель-Подписчик (Publisher-Subscriber)
При изменении состояния одного объекта все зависимые от него объекты (подписчики) оповещаются об обновлении.
Состояние (State)Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).
Стратегия (Strategy)Определяет семейство алгоритмов и позволяет менять алгоритм независимо от объекта-клиента, который им пользуется.
Шаблонный метод (Template Method)Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
Посетитель (Visitor)Позволяет выполнить над каждым объектом некоторой структуры операцию, не загрязняя код класса этого объекта и не используя определение типа для каждого объекта.
Разновидность - иерархический визитор - позволяет обойти иерархическую структуру (дерево)
Архитектурные паттерны Модель-Представление-Контроллер (Model-View-Controller,MVC)Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.