Страница курса Паттерны проектирования — различия между версиями
Admin (обсуждение | вклад) (→Адаптер (Adapter)) |
Admin (обсуждение | вклад) (→Интернет-источники) |
||
(не показаны 43 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
__NOTOC__ | __NOTOC__ | ||
== Материалы к курсу == | == Материалы к курсу == | ||
+ | |||
+ | [[Темы докладов и рефератов]] | ||
+ | |||
+ | === Раздаточные материалы === | ||
+ | [http://it.mmcs.sfedu.ru/docs/Miks/Patterns/Lection2.pdf Лекция 2] | ||
=== Литература === | === Литература === | ||
# Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. '''Основная книга''' | # Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. '''Основная книга''' | ||
− | # Гранд М. - Шаблоны проектирования в Java. | + | # Стелтинг С., Массен О. Применение шаблонов Java '''Хорошая книга с несколькими новыми паттернами''' |
+ | # Гранд М. - Шаблоны проектирования в Java. | ||
# Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. '''Слишком популярная книга.''' Может служить источником нескольких примеров | # Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. '''Слишком популярная книга.''' Может служить источником нескольких примеров | ||
# Смит Д. Элементарные шаблоны проектирования (2013). '''Попытка выделить в стандартных шаблонах элементарные и формализовать описание шаблонов.''' | # Смит Д. Элементарные шаблоны проектирования (2013). '''Попытка выделить в стандартных шаблонах элементарные и формализовать описание шаблонов.''' | ||
− | # | + | # Мартин Фаулер. Архитектура корпоративных программных приложений. '''Паттерны в корпоративных приложениях''' |
=== Софт === | === Софт === | ||
Строка 14: | Строка 20: | ||
=== Интернет-источники === | === Интернет-источники === | ||
+ | # [http://www.c2.com/cgi/wiki Очень полное описание паттернов проектирования на английском (New июль 2015)] | ||
# [http://citforum.ru/SE/project/pattern Обзор паттернов проектирования на citforum.ru] | # [http://citforum.ru/SE/project/pattern Обзор паттернов проектирования на citforum.ru] | ||
# [http://habrahabr.ru/post/210288/ Шпаргалка по шаблонам проектирования на Хабрахабре] | # [http://habrahabr.ru/post/210288/ Шпаргалка по шаблонам проектирования на Хабрахабре] | ||
Строка 35: | Строка 42: | ||
* Пополнение коллекции удачных простых хорошо запоминающихся примеров реализации паттернов | * Пополнение коллекции удачных простых хорошо запоминающихся примеров реализации паттернов | ||
− | + | == Необходимые факты из ООП == | |
* [http://it.mmcs.sfedu.ru/wiki/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%E2%80%94_%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B9_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80_08-09;_%D0%9C%D0%B8%D1%85%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2%D0%B8%D1%87_%D0%A1.%D0%A1.;_VI_%D1%87%D0%B0%D1%81%D1%82%D1%8C#.D0.92.D0.B8.D0.B4.D1.8B_.D0.BE.D1.82.D0.BD.D0.BE.D1.88.D0.B5.D0.BD.D0.B8.D0.B9_.D0.BC.D0.B5.D0.B6.D0.B4.D1.83_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.B0.D0.BC.D0.B8_.28.D0.BD.D0.BE.D1.82.D0.B0.D1.86.D0.B8.D1.8F_UML-.D0.B4.D0.B8.D0.B0.D0.B3.D1.80.D0.B0.D0.BC.D0.BC_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.BE.D0.B2.29 Нотация UML-диаграмм классов] и диаграмм последовательности | * [http://it.mmcs.sfedu.ru/wiki/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%E2%80%94_%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B9_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80_08-09;_%D0%9C%D0%B8%D1%85%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2%D0%B8%D1%87_%D0%A1.%D0%A1.;_VI_%D1%87%D0%B0%D1%81%D1%82%D1%8C#.D0.92.D0.B8.D0.B4.D1.8B_.D0.BE.D1.82.D0.BD.D0.BE.D1.88.D0.B5.D0.BD.D0.B8.D0.B9_.D0.BC.D0.B5.D0.B6.D0.B4.D1.83_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.B0.D0.BC.D0.B8_.28.D0.BD.D0.BE.D1.82.D0.B0.D1.86.D0.B8.D1.8F_UML-.D0.B4.D0.B8.D0.B0.D0.B3.D1.80.D0.B0.D0.BC.D0.BC_.D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.BE.D0.B2.29 Нотация UML-диаграмм классов] и диаграмм последовательности | ||
* Защита доступа в C# | * Защита доступа в C# | ||
Строка 45: | Строка 52: | ||
* Полиморфизм и принцип подстановки | * Полиморфизм и принцип подстановки | ||
* Интерфейсы | * Интерфейсы | ||
− | |||
* Абстрактные классы, определение виртуальных методов для них | * Абстрактные классы, определение виртуальных методов для них | ||
+ | |||
+ | == Введение в паттерны проектирования == | ||
+ | === Что такое паттерн проектирования === | ||
+ | '''Паттерн проектирования''' - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. | ||
+ | |||
+ | Паттерн проектирования состоит из четырех элементов. | ||
+ | #''Имя.''Обращаясь к паттерну по имени, можно вести обсуждение с коллегами, упоминать паттерны в документации. | ||
+ | #''Задача.'' Описание того, когда следует применять паттерн. Может описываться конкретная проблема, при решении которой уместно использовать паттерн. | ||
+ | #''Решение.''Описание классов и объектов, связей между ними. | ||
+ | #''Результаты.'' Преимущества и недостатки данного паттерна. Влияние на степень гибкости, расширяемости и переносимости всей системы. | ||
+ | |||
+ | === Описание паттернов проектирования=== | ||
+ | *'''Название и классификация паттерна''' | ||
+ | *'''Назначение''' | ||
+ | *'''Известен также под именем''' | ||
+ | *'''Мотивация (описание)''' | ||
+ | Какие недостатки есть у существующих решений и как паттерн помогает их решать. | ||
+ | *'''Использование''' | ||
+ | Ситуации, в которых уместно использовать данный паттерн. | ||
+ | *'''Структура''' | ||
+ | Диаграмма классов паттерна. Возможно, диаграмма последовательности. | ||
+ | *'''Участники''' | ||
+ | Классы и объекты и их методы | ||
+ | *'''Отношения''' | ||
+ | Взаимодействие классов и объектов | ||
+ | *'''Результаты (достоинства и недостатки)''' | ||
+ | Результаты применения, компромиссы. Какие аспекты поведения системы можно независимо изменять, используя данный паттерн. | ||
+ | *'''Реализация''' | ||
+ | Сложности реализации, зависимость от используемых языков программирования | ||
+ | *'''Пример кода''' | ||
+ | *'''Известные применения''' | ||
+ | *'''Родственные паттерны''' | ||
=== Ранее известные паттерны === | === Ранее известные паттерны === | ||
Строка 57: | Строка 95: | ||
=== Порождающие паттерны === | === Порождающие паттерны === | ||
+ | |||
+ | ==== [[MazeGame]] ==== | ||
+ | [[MazeGame]] - общий пример для порождающих паттернов Абстрактная фабрика, Строитель, Фабричный метод, Прототип. | ||
==== [[Абстрактная фабрика (Abstract Factory)]] ==== | ==== [[Абстрактная фабрика (Abstract Factory)]] ==== | ||
− | + | Предоставляет интерфейс для создания компонентов системы. | |
− | |||
− | |||
==== [[Строитель (Builder)]] ==== | ==== [[Строитель (Builder)]] ==== | ||
− | + | Предоставляет интерфейс для создания частей сложного объекта и возвращения сконструированного объекта. | |
− | |||
− | |||
==== [[Фабричный метод (Factory Method)]] ==== | ==== [[Фабричный метод (Factory Method)]] ==== | ||
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать. | Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать. | ||
− | + | ==== [[Прототип (Prototype)]] ==== | |
+ | Облегчает динамическое создание путем определения классов, объекты которых могут создавать свои дубликаты. | ||
− | ==== | + | ==== [[Одиночка (Singleton)]] ==== |
− | + | Обеспечивает наличие в системе только одного экземпляра заданного класса, предоставляет доступ к этому экземпляру. | |
==== [[Пул объектов (Object Pool)]] ==== | ==== [[Пул объектов (Object Pool)]] ==== | ||
− | + | Обеспечивает интерфейс для работы с набором инициализированных и готовых к использованию объектов. | |
− | ==== | + | ==== Отложенная инициализация (Lazy Initialization) ==== |
− | + | Объект, инициализируемый во время первого обращения к нему. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Структурные паттерны === | === Структурные паттерны === | ||
Строка 93: | Строка 125: | ||
Адаптирует интерфейс одного класса к другому. | Адаптирует интерфейс одного класса к другому. | ||
− | ==== [[Мост (Bridge]] | + | ==== [[Мост (Bridge)]] ==== |
− | Позволяет менять интерфейс и реализацию независимо | + | Позволяет менять интерфейс и реализацию независимо друг от друга. |
− | |||
− | |||
==== [[Компоновщик (Composite)]] ==== | ==== [[Компоновщик (Composite)]] ==== | ||
Строка 104: | Строка 134: | ||
==== [[Декоратор (Decorator)]] ==== | ==== [[Декоратор (Decorator)]] ==== | ||
− | |||
Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения). | Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения). | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==== [[Фасад (Facade)]]==== | ==== [[Фасад (Facade)]]==== | ||
Строка 117: | Строка 140: | ||
==== [[Приспособленец (Flyweight)]] ==== | ==== [[Приспособленец (Flyweight)]] ==== | ||
− | + | Уменьшает количество объектов системы с многочисленными низкоуровневыми особенностями путем совместного использования подобных объектов. | |
− | |||
− | |||
==== [[Заместитель (Proxy)]] ==== | ==== [[Заместитель (Proxy)]] ==== |
Текущая версия на 13:20, 5 июля 2015
Материалы к курсу
Раздаточные материалы
Литература
- Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. Основная книга
- Стелтинг С., Массен О. Применение шаблонов 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
Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.