Страница курса Паттерны проектирования — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Ранее известные паттерны)
(Интернет-источники)
 
(не показаны 124 промежуточные версии этого же участника)
Строка 1: Строка 1:
== План лекций (набросок) ==
+
__NOTOC__
 +
== Материалы к курсу ==
 +
 
 +
[[Темы докладов и рефератов]]
 +
 
 +
=== Раздаточные материалы ===
 +
[http://it.mmcs.sfedu.ru/docs/Miks/Patterns/Lection2.pdf Лекция 2]
  
 
=== Литература ===
 
=== Литература ===
# Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования
+
# Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. '''Основная книга'''
# Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования
+
# Стелтинг С., Массен О. Применение шаблонов Java '''Хорошая книга с несколькими новыми паттернами'''
# Гранд М. - Шаблоны проектирования в Java
+
# Гранд М. - Шаблоны проектирования в Java.
# Смит Д. Элементарные шаблоны проектирования (2013)
+
# Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. '''Слишком популярная книга.''' Может служить источником нескольких примеров
# Стерлинг С., Массен О. Применение шаблонов Java
+
# Смит Д. Элементарные шаблоны проектирования (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://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://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

Материалы к курсу

Темы докладов и рефератов

Раздаточные материалы

Лекция 2

Литература

  1. Д. Влиссидес, Э.Гамма, Р. Хелм, Р. Джонсон. Приёмы объектно ориентированного проектирования.Паттерны проектирования. Основная книга
  2. Стелтинг С., Массен О. Применение шаблонов Java Хорошая книга с несколькими новыми паттернами
  3. Гранд М. - Шаблоны проектирования в Java.
  4. Фримен Р., Фримен Л., Сьерра К., Бейтс Б. - Паттерны проектирования. Слишком популярная книга. Может служить источником нескольких примеров
  5. Смит Д. Элементарные шаблоны проектирования (2013). Попытка выделить в стандартных шаблонах элементарные и формализовать описание шаблонов.
  6. Мартин Фаулер. Архитектура корпоративных программных приложений. Паттерны в корпоративных приложениях

Софт

  1. UMLet - Редактор диаграмм UML с простым интерфейсом.
  2. Microsoft Visio (по подписке MSDN)

Интернет-источники

  1. Очень полное описание паттернов проектирования на английском (New июль 2015)
  2. Обзор паттернов проектирования на citforum.ru
  3. Шпаргалка по шаблонам проектирования на Хабрахабре
  4. Шпаргалка по шаблонам проектирования на itdumka.com.ua
  5. Design Patterns with C# examples
  6. Шаблоны проектирования (статья в Википедии)

Типы заданий

  • По системе классов нарисовать UML-диаграмму
  • По UML-диаграмме создать систему классов
  • Реализовать задачу с применением данного паттерна и сдать отчет в указанном виде (вид отчета на паттерны разработать)
  • В коде увидеть паттерн
  • Переделать код без паттерна в код с паттерном
  • Расширить работающий код с паттерном новой функциональностью (связь с ООП)

На лекциях:

  • Доклады по конкретным реализациям паттернов в промышленных системах.
  • Доклады по паттернам в параллельном программировании (везде они выносятся как отдельная тема)

Для дополнительных баллов рейтинга:

  • Пополнение коллекции удачных простых хорошо запоминающихся примеров реализации паттернов

Необходимые факты из ООП

  • Нотация UML-диаграмм классов и диаграмм последовательности
  • Защита доступа в C#
  • Свойства в C#, их особенности
  • Делегаты C# (Указатели на функции, процедурные переменные). Multicast-делегаты
  • События C# (events) - при необходимости
  • Делегирование (один класс делегирует действия другому классу)
  • Наследование и принцип Открыт-Закрыт
  • Полиморфизм и принцип подстановки
  • Интерфейсы
  • Абстрактные классы, определение виртуальных методов для них

Введение в паттерны проектирования

Что такое паттерн проектирования

Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.

Паттерн проектирования состоит из четырех элементов.

  1. Имя.Обращаясь к паттерну по имени, можно вести обсуждение с коллегами, упоминать паттерны в документации.
  2. Задача. Описание того, когда следует применять паттерн. Может описываться конкретная проблема, при решении которой уместно использовать паттерн.
  3. Решение.Описание классов и объектов, связей между ними.
  4. Результаты. Преимущества и недостатки данного паттерна. Влияние на степень гибкости, расширяемости и переносимости всей системы.

Описание паттернов проектирования

  • Название и классификация паттерна
  • Назначение
  • Известен также под именем
  • Мотивация (описание)

Какие недостатки есть у существующих решений и как паттерн помогает их решать.

  • Использование

Ситуации, в которых уместно использовать данный паттерн.

  • Структура

Диаграмма классов паттерна. Возможно, диаграмма последовательности.

  • Участники

Классы и объекты и их методы

  • Отношения

Взаимодействие классов и объектов

  • Результаты (достоинства и недостатки)

Результаты применения, компромиссы. Какие аспекты поведения системы можно независимо изменять, используя данный паттерн.

  • Реализация

Сложности реализации, зависимость от используемых языков программирования

  • Пример кода
  • Известные применения
  • Родственные паттерны

Ранее известные паттерны

  • Упаковка параметров
  • Делегирование
  • Итератор
  • Выполнение операции для элементов полиморфного контейнера

Каталог основных паттернов

Порождающие паттерны

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

Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.