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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Абстрактная фабрика)
Строка 51: Строка 51:
 
=== Порождающие паттерны ===
 
=== Порождающие паттерны ===
  
==== [[Абстрактная фабрика]] ====
+
==== [[Абстрактная фабрика (Abstract Factory)]] ====
 
Класс, предоставляющий собой интерфейс для создания компонентов системы.
 
Класс, предоставляющий собой интерфейс для создания компонентов системы.
  
 
Пример. MazeGame
 
Пример. MazeGame
  
==== Строитель (Builder) ====
+
==== [[Строитель (Builder)]] ====
 
Класс, предоставляющий интерфейс для создания частей сложного объекта и возвращающий сконструированный объект.
 
Класс, предоставляющий интерфейс для создания частей сложного объекта и возвращающий сконструированный объект.
  
 
Пример. MazeGame
 
Пример. MazeGame
  
==== Фабричный метод ====
+
==== [[Фабричный метод (Factory Method)]] ====
 
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
 
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
  
 
Пример MazeGame
 
Пример MazeGame
  
==== Отложенная инициализация (Lazy initialization) ====
+
==== Отложенная инициализация (Lazy Initialization) ====
 
Объект, инициализируемый во время первого обращения к нему.
 
Объект, инициализируемый во время первого обращения к нему.
  
==== Пул объектов (Object Pool) ====
+
==== [[Пул объектов (Object Pool)]] ====
 
Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.
 
Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.
  
==== Прототип ====
+
==== [[Прототип (Prototype]] ====
 
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.  
 
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.  
  
 
Пример. MazeGame
 
Пример. MazeGame
  
==== Одиночка (Singleton) ====
+
==== [[Одиночка (Singleton)]] ====
 
Класс, который может иметь только один экземпляр.
 
Класс, который может иметь только один экземпляр.
 
Пример. Класс Графической системы
 
Пример. Класс Графической системы
Строка 83: Строка 83:
 
=== Структурные паттерны ===
 
=== Структурные паттерны ===
  
==== Адаптер ====
+
==== [[Адаптер (Adapter)]] ====
 
Адаптирует интерфейс одного класса к другому
 
Адаптирует интерфейс одного класса к другому
  
==== Мост (Bridge) ====
+
==== [[Мост (Bridge]]) ====
 
Позволяет менять интерфейс и реализацию независимо.
 
Позволяет менять интерфейс и реализацию независимо.
  
 
Пример: [http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%81%D1%82_%28%D1%88%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%29 множество фигур и множество графических систем].
 
Пример: [http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%81%D1%82_%28%D1%88%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%29 множество фигур и множество графических систем].
  
==== Компоновщик (Composite) ====
+
==== [[Компоновщик (Composite)]] ====
 
Объединяет объекты в древовидные структуры. Единообразно трактует простые и составные объекты.
 
Объединяет объекты в древовидные структуры. Единообразно трактует простые и составные объекты.
  
 
Пример. Графические фигуры - это окружность, квадрат, отрезок и СоставнаяФигура, которая состоит из других фигур, в то же время являясь фигурой.
 
Пример. Графические фигуры - это окружность, квадрат, отрезок и СоставнаяФигура, которая состоит из других фигур, в то же время являясь фигурой.
  
==== Декоратор (Обертка, Wrapper) ====
+
==== [[Декоратор (Decorator)]] ====
 +
Другое название: Обертка (Wrapper)
 
Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения).
 
Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения).
  
Строка 105: Строка 106:
 
Пример. Фримен. Кофе и дополнения: шоколад, ваниль, молоко, пена...
 
Пример. Фримен. Кофе и дополнения: шоколад, ваниль, молоко, пена...
  
==== Фасад ====
+
==== [[Фасад (Facade)]]====
 
Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
 
Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
  
==== Приспособленец (Flyweight) ====
+
==== [[Приспособленец (Flyweight)]] ====
 
Используется для уменьшения затрат при работе с большим количеством мелких объектов.
 
Используется для уменьшения затрат при работе с большим количеством мелких объектов.
  
 
Пример. В графическом редакторе не надо хранить каждый символ в виде объекта. Достаточно хранить по одному объекту для каждого из используемых символов кодовой таблицы и в метод рисования передавать контекст рисования (например, строку-столбец). Таким образом, у каждого объекта есть внутреннее состояние (символ, который он представляет) и внешнее (строка-столбец), которое не хранится вместе с объектом, а передается ему как параметр в качестве внешнего контекста.
 
Пример. В графическом редакторе не надо хранить каждый символ в виде объекта. Достаточно хранить по одному объекту для каждого из используемых символов кодовой таблицы и в метод рисования передавать контекст рисования (например, строку-столбец). Таким образом, у каждого объекта есть внутреннее состояние (символ, который он представляет) и внешнее (строка-столбец), которое не хранится вместе с объектом, а передается ему как параметр в качестве внешнего контекста.
  
==== Заместитель (Proxy) ====
+
==== [[Заместитель (Proxy)]] ====
 
Заместитель ведет себя точно так же как и основной объект, выполняя при необходимости его инстанцирование.
 
Заместитель ведет себя точно так же как и основной объект, выполняя при необходимости его инстанцирование.
  
 
=== Паттерны поведения ===
 
=== Паттерны поведения ===
  
==== Цепочка обязанностей (Chain of Responsibility) ====
+
==== [[Цепочка обязанностей (Chain of Responsibility)]] ====
 
Некий запрос должен быть обработан в цепочке взаимосвязанных объектов (список, дерево - движение от листьев к корню). Объект либо обрабатывает запрос, либо передвает по цепочке следующему объекту. Если ни один из объектов не обработал запрос, то может происходить какое-то действие.
 
Некий запрос должен быть обработан в цепочке взаимосвязанных объектов (список, дерево - движение от листьев к корню). Объект либо обрабатывает запрос, либо передвает по цепочке следующему объекту. Если ни один из объектов не обработал запрос, то может происходить какое-то действие.
  
==== Команда ====
+
==== [[Команда (Command)]]====
 
Упаковка действий в объекты с целью сделать откат изменений (Redo), логирование, комбинирование действий.
 
Упаковка действий в объекты с целью сделать откат изменений (Redo), логирование, комбинирование действий.
  
Строка 132: Строка 133:
 
Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
 
Хранитель - это объект, в котором сохраняется состояние другого объекта - хозяина хранителя. Это необходимо для того чтобы хозяин мог записать в хранитель некоторую контрольную точку - своё текущее состояние, а потом вернуться к этому состоянию.
  
==== Null Object (не GoF) ====
+
==== [[Null Object]] ====
 +
Не GoF.
 +
 
 
Предотвращает нулевые указатели, предоставляя объект «по умолчанию».
 
Предотвращает нулевые указатели, предоставляя объект «по умолчанию».
  
==== [[Наблюдатель (Observer)]] или Издатель-Подписчик (Publisher-Subscriber) ====
+
==== [[Наблюдатель (Observer)]] ====
 +
Другое имя: Издатель-Подписчик (Publisher-Subscriber)  
 +
 
 
При изменении состояния одного объекта все зависимые от него объекты (подписчики) оповещаются об обновлении.
 
При изменении состояния одного объекта все зависимые от него объекты (подписчики) оповещаются об обновлении.
  
Строка 141: Строка 146:
 
Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).
 
Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).
  
==== Стратегия ====
+
==== [[Стратегия (Strategy)]] ====
 
Определяет семейство алгоритмов и позволяет менять алгоритм независимо от объекта-клиента, который им пользуется.
 
Определяет семейство алгоритмов и позволяет менять алгоритм независимо от объекта-клиента, который им пользуется.
  
==== Шаблонный метод ====
+
==== [[Шаблонный метод (Template Method)]] ====
 
Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
 
Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
  
==== Посетитель (Visitor) ====
+
==== [[Посетитель (Visitor)]] ====
 
Позволяет выполнить над каждым объектом некоторой структуры операцию, не загрязняя код класса этого объекта и не используя определение типа для каждого объекта.
 
Позволяет выполнить над каждым объектом некоторой структуры операцию, не загрязняя код класса этого объекта и не используя определение типа для каждого объекта.
  
Строка 154: Строка 159:
 
=== Архитектурные паттерны ===
 
=== Архитектурные паттерны ===
  
==== [http://ru.wikipedia.org/wiki/Model-View-Controller Model-View-Controller] (MVC, Модель-Представление-Контроллер) ====
+
==== [[Модель-Представление-Контроллер (Model-View-Controller,MVC)]] ====
 +
 
 +
[http://ru.wikipedia.org/wiki/Model-View-Controller ссылка на статью в Википедию о паттерне MVC]  
 
Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.
 
Модель данных приложения (бизнес-логика), пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Является по-существу схемой использования нескольких шаблонов проектирования.

Версия 17:50, 20 июля 2014

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

Литература

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

Софт

  1. UMLet - Редактор диаграмм UML с простым интерфейсом.

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

  1. Обзор паттернов проектирования на citforum.ru
  2. Шпаргалка по шаблонам проектирования на Хабрахабре
  3. Шпаргалка по шаблонам проектирования на itdumka.com.ua

Типы заданий

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

На лекциях:

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

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

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

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

  • Нотация UML-диаграмм классов и диаграмм последовательности
  • Указатели на функции (процедурные переменные)
  • Делегирование
  • Наследование и принцип Открыт-Закрыт
  • Полиморфизм и принцип подстановки
  • Интерфейсы
  • Маркер-интерфейс - интерфейс, не содержащий методов и предназначенный только для того чтобы пометить класс, его реализующий, указав тем самым на принадлежность к некоторой классификации. Гранд относит Маркер-интерфейс к основным шаблонам проектирования.

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

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

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

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

Абстрактная фабрика (Abstract Factory)

Класс, предоставляющий собой интерфейс для создания компонентов системы.

Пример. MazeGame

Строитель (Builder)

Класс, предоставляющий интерфейс для создания частей сложного объекта и возвращающий сконструированный объект.

Пример. MazeGame

Фабричный метод (Factory Method)

Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.

Пример MazeGame

Отложенная инициализация (Lazy Initialization)

Объект, инициализируемый во время первого обращения к нему.

Пул объектов (Object Pool)

Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.

Прототип (Prototype

Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.

Пример. MazeGame

Одиночка (Singleton)

Класс, который может иметь только один экземпляр. Пример. Класс Графической системы

Структурные паттерны

Адаптер (Adapter)

Адаптирует интерфейс одного класса к другому

Мост (Bridge)

Позволяет менять интерфейс и реализацию независимо.

Пример: множество фигур и множество графических систем.

Компоновщик (Composite)

Объединяет объекты в древовидные структуры. Единообразно трактует простые и составные объекты.

Пример. Графические фигуры - это окружность, квадрат, отрезок и СоставнаяФигура, которая состоит из других фигур, в то же время являясь фигурой.

Декоратор (Decorator)

Другое название: Обертка (Wrapper) Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения).

Пример. В Java - разновидности файловых потоков. К стандартному файловому потоку могут быть добавлены декораторы буферизации, шифрования, архивации и проч. в любых комбинациях.

Декоратор принимает отдекорированный предыдущими декораторами объект и возвращает объект с дополнительной декорацией.

Пример. Фримен. Кофе и дополнения: шоколад, ваниль, молоко, пена...

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