Страница курса Паттерны проектирования — различия между версиями
Admin (обсуждение | вклад) (→Ранее известные паттерны) |
Admin (обсуждение | вклад) (→Интернет-источники) |
||
(не показаны 124 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | == | + | __NOTOC__ |
+ | == Материалы к курсу == | ||
+ | |||
+ | [[Темы докладов и рефератов]] | ||
+ | |||
+ | === Раздаточные материалы === | ||
+ | [http://it.mmcs.sfedu.ru/docs/Miks/Patterns/Lection2.pdf Лекция 2] | ||
=== Литература === | === Литература === | ||
− | # Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования | + | # Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. '''Основная книга''' |
− | # Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования | + | # Стелтинг С., Массен О. Применение шаблонов Java '''Хорошая книга с несколькими новыми паттернами''' |
− | + | # Гранд М. - Шаблоны проектирования в Java. | |
− | # Смит Д. Элементарные шаблоны проектирования (2013) | + | # Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. '''Слишком популярная книга.''' Может служить источником нескольких примеров |
− | # | + | # Смит Д. Элементарные шаблоны проектирования (2013). '''Попытка выделить в стандартных шаблонах элементарные и формализовать описание шаблонов.''' |
+ | # Мартин Фаулер. Архитектура корпоративных программных приложений. '''Паттерны в корпоративных приложениях''' | ||
+ | |||
+ | === Софт === | ||
+ | # [http://www.umlet.com UMLet] - Редактор диаграмм UML с простым интерфейсом. | ||
+ | # Microsoft Visio (по подписке MSDN) | ||
+ | |||
+ | === Интернет-источники === | ||
+ | # [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/ Шпаргалка по шаблонам проектирования на Хабрахабре] | ||
# [http://itdumka.com.ua/index.php?cmd=shownode&node=11 Шпаргалка по шаблонам проектирования на itdumka.com.ua] | # [http://itdumka.com.ua/index.php?cmd=shownode&node=11 Шпаргалка по шаблонам проектирования на itdumka.com.ua] | ||
− | # [http:// | + | # [http://dofactory.com/Patterns/Patterns.aspx Design Patterns with C# examples] |
+ | # [http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F Шаблоны проектирования (статья в Википедии)] | ||
=== Типы заданий === | === Типы заданий === | ||
Строка 18: | Строка 33: | ||
* В коде увидеть паттерн | * В коде увидеть паттерн | ||
* Переделать код без паттерна в код с паттерном | * Переделать код без паттерна в код с паттерном | ||
+ | * Расширить работающий код с паттерном новой функциональностью (связь с ООП) | ||
+ | |||
+ | '''На лекциях:''' | ||
+ | * Доклады по конкретным реализациям паттернов в промышленных системах. | ||
+ | * Доклады по паттернам в параллельном программировании (везде они выносятся как отдельная тема) | ||
+ | |||
+ | '''Для дополнительных баллов рейтинга:''' | ||
+ | * Пополнение коллекции удачных простых хорошо запоминающихся примеров реализации паттернов | ||
− | + | == Необходимые факты из ООП == | |
− | * Нотация 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#, их особенности |
+ | * Делегаты C# (Указатели на функции, процедурные переменные). Multicast-делегаты | ||
+ | * События C# (events) - при необходимости | ||
+ | * Делегирование (один класс делегирует действия другому классу) | ||
+ | * Наследование и принцип Открыт-Закрыт | ||
* Полиморфизм и принцип подстановки | * Полиморфизм и принцип подстановки | ||
− | * | + | * Интерфейсы |
+ | * Абстрактные классы, определение виртуальных методов для них | ||
+ | |||
+ | == Введение в паттерны проектирования == | ||
+ | === Что такое паттерн проектирования === | ||
+ | '''Паттерн проектирования''' - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. | ||
+ | |||
+ | Паттерн проектирования состоит из четырех элементов. | ||
+ | #''Имя.''Обращаясь к паттерну по имени, можно вести обсуждение с коллегами, упоминать паттерны в документации. | ||
+ | #''Задача.'' Описание того, когда следует применять паттерн. Может описываться конкретная проблема, при решении которой уместно использовать паттерн. | ||
+ | #''Решение.''Описание классов и объектов, связей между ними. | ||
+ | #''Результаты.'' Преимущества и недостатки данного паттерна. Влияние на степень гибкости, расширяемости и переносимости всей системы. | ||
+ | |||
+ | === Описание паттернов проектирования=== | ||
+ | *'''Название и классификация паттерна''' | ||
+ | *'''Назначение''' | ||
+ | *'''Известен также под именем''' | ||
+ | *'''Мотивация (описание)''' | ||
+ | Какие недостатки есть у существующих решений и как паттерн помогает их решать. | ||
+ | *'''Использование''' | ||
+ | Ситуации, в которых уместно использовать данный паттерн. | ||
+ | *'''Структура''' | ||
+ | Диаграмма классов паттерна. Возможно, диаграмма последовательности. | ||
+ | *'''Участники''' | ||
+ | Классы и объекты и их методы | ||
+ | *'''Отношения''' | ||
+ | Взаимодействие классов и объектов | ||
+ | *'''Результаты (достоинства и недостатки)''' | ||
+ | Результаты применения, компромиссы. Какие аспекты поведения системы можно независимо изменять, используя данный паттерн. | ||
+ | *'''Реализация''' | ||
+ | Сложности реализации, зависимость от используемых языков программирования | ||
+ | *'''Пример кода''' | ||
+ | *'''Известные применения''' | ||
+ | *'''Родственные паттерны''' | ||
=== Ранее известные паттерны === | === Ранее известные паттерны === | ||
Строка 31: | Строка 91: | ||
* Итератор | * Итератор | ||
* Выполнение операции для элементов полиморфного контейнера | * Выполнение операции для элементов полиморфного контейнера | ||
+ | |||
+ | == Каталог основных паттернов == | ||
+ | |||
+ | === Порождающие паттерны === | ||
+ | |||
+ | ==== [[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)]] ==== | ||
+ | |||
+ | [http://ru.wikipedia.org/wiki/Model-View-Controller Ссылка на статью в Википедию о паттерне MVC] | ||
+ | |||
+ | Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования. |
Текущая версия на 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
Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.