Страница курса Паттерны проектирования
Материалы к курсу
Раздаточные материалы
Литература
- Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. Основная книга
- Стелтинг С., Массен О. Применение шаблонов Java Хорошая книга с несколькими новыми паттернами
- Гранд М. - Шаблоны проектирования в Java.
- Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. Слишком популярная книга. Может служить источником нескольких примеров
- Смит Д. Элементарные шаблоны проектирования (2013). Попытка выделить в стандартных шаблонах элементарные и формализовать описание шаблонов.
- Мартин Фаулер. Архитектура корпоративных программных приложений. Паттерны в корпоративных приложениях
Софт
- UMLet - Редактор диаграмм UML с простым интерфейсом.
- Microsoft Visio (по подписке MSDN)
Интернет-источники
- Очень полное описание паттернов проектирования на английском (New июль 2015)
- Обзор паттернов проектирования на citforum.ru
- Шпаргалка по шаблонам проектирования на Хабрахабре
- Шпаргалка по шаблонам проектирования на itdumka.com.ua
- Design Patterns with C# examples
- Шаблоны проектирования (статья в Википедии)
Типы заданий
- По системе классов нарисовать UML-диаграмму
- По UML-диаграмме создать систему классов
- Реализовать задачу с применением данного паттерна и сдать отчет в указанном виде (вид отчета на паттерны разработать)
- В коде увидеть паттерн
- Переделать код без паттерна в код с паттерном
- Расширить работающий код с паттерном новой функциональностью (связь с ООП)
На лекциях:
- Доклады по конкретным реализациям паттернов в промышленных системах.
- Доклады по паттернам в параллельном программировании (везде они выносятся как отдельная тема)
Для дополнительных баллов рейтинга:
- Пополнение коллекции удачных простых хорошо запоминающихся примеров реализации паттернов
Необходимые факты из ООП
- Нотация UML-диаграмм классов и диаграмм последовательности
- Защита доступа в C#
- Свойства в C#, их особенности
- Делегаты C# (Указатели на функции, процедурные переменные). Multicast-делегаты
- События C# (events) - при необходимости
- Делегирование (один класс делегирует действия другому классу)
- Наследование и принцип Открыт-Закрыт
- Полиморфизм и принцип подстановки
- Интерфейсы
- Абстрактные классы, определение виртуальных методов для них
Введение в паттерны проектирования
Что такое паттерн проектирования
Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.
Паттерн проектирования состоит из четырех элементов.
- Имя.Обращаясь к паттерну по имени, можно вести обсуждение с коллегами, упоминать паттерны в документации.
- Задача. Описание того, когда следует применять паттерн. Может описываться конкретная проблема, при решении которой уместно использовать паттерн.
- Решение.Описание классов и объектов, связей между ними.
- Результаты. Преимущества и недостатки данного паттерна. Влияние на степень гибкости, расширяемости и переносимости всей системы.
Описание паттернов проектирования
- Название и классификация паттерна
- Назначение
- Известен также под именем
- Мотивация (описание)
Какие недостатки есть у существующих решений и как паттерн помогает их решать.
- Использование
Ситуации, в которых уместно использовать данный паттерн.
- Структура
Диаграмма классов паттерна. Возможно, диаграмма последовательности.
- Участники
Классы и объекты и их методы
- Отношения
Взаимодействие классов и объектов
- Результаты (достоинства и недостатки)
Результаты применения, компромиссы. Какие аспекты поведения системы можно независимо изменять, используя данный паттерн.
- Реализация
Сложности реализации, зависимость от используемых языков программирования
- Пример кода
- Известные применения
- Родственные паттерны
Ранее известные паттерны
- Упаковка параметров
- Делегирование
- Итератор
- Выполнение операции для элементов полиморфного контейнера
Каталог основных паттернов
Порождающие паттерны
MazeGame
MazeGame - общий пример для порождающих паттернов Абстрактная фабрика, Строитель, Фабричный метод, Прототип.
Абстрактная фабрика (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
Не GoF.
Предотвращает нулевые указатели, предоставляя объект «по умолчанию».
Наблюдатель (Observer)
Другое имя: Издатель-Подписчик (Publisher-Subscriber)
При изменении состояния одного объекта все зависимые от него объекты (подписчики) оповещаются об обновлении.
Состояние (State)
Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).
Стратегия (Strategy)
Определяет семейство алгоритмов и позволяет менять алгоритм независимо от объекта-клиента, который им пользуется.
Шаблонный метод (Template Method)
Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
Посетитель (Visitor)
Позволяет выполнить над каждым объектом некоторой структуры операцию, не загрязняя код класса этого объекта и не используя определение типа для каждого объекта.
Разновидность - иерархический визитор - позволяет обойти иерархическую структуру (дерево)
Архитектурные паттерны
Модель-Представление-Контроллер (Model-View-Controller,MVC)
Ссылка на статью в Википедию о паттерне MVC
Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.