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

Содержание

Слайд 2

Описание взаимодействия объектов и классов адаптированных для решения задачи проектирования в

Описание взаимодействия объектов и классов адаптированных для решения задачи проектирования в

конкретном контексте.
Удачные проектные решения, которые можно использовать снова и снова.
Слайд 3

Именует, абстрагирует, идентифицирует ключевые аспекты структуры общего решения для повторно используемого

Именует, абстрагирует, идентифицирует ключевые аспекты структуры общего решения для повторно используемого

дизайна.
Вычленяет участвующие классы и экземпляры, их роли и отношения и функции.
Учитывает проектные ограничения и последствия.
Слайд 4

Это не серебренная пуля, чрезмерное злоупотребление шаблонами пагубно – снижение качества

Это не серебренная пуля, чрезмерное злоупотребление шаблонами пагубно – снижение качества

анализа.
Это не библиотеки классов, не готовые приложения или системы - каждый раз нужно реализовывать свою конкретную задачу.
Не нечто очень сложное – в основе лежат простые принципы.
Слайд 5

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

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

модели предметной области;
Анализ и следующая итерация.
Слайд 6

Паттерны проектирования классов/обьектов (Классификация GoF) Архитектурные системные паттерны Паттерны интеграции корпоративных информационных систем

Паттерны проектирования классов/обьектов (Классификация GoF)
Архитектурные системные паттерны
Паттерны интеграции корпоративных информационных систем

Слайд 7

Design Patterns: Elements of Reusable Object-Oriented Software — книга 1994 года

Design Patterns: Elements of
Reusable Object-Oriented Software —
книга 1994 года

об инженерии программного обеспечения, описывающая решения некоторых частых проблем в проектировании ПО. Авторы книги: Эрих Гамма (Erich Gamma), Ричард Хелм (Richard Helm), Ральф Джонсон (Ralph Johnson), Джон Влиссидс (John Vlissides). Коллектив авторов также известен как «Банда четырёх»
Слайд 8

Слайд 9

Структурные паттерны проектирования классов/объектов Адаптер (Adapter) Оболочка (Wrapper) Заместитель (Proxy) Компоновщик

Структурные паттерны проектирования классов/объектов

Адаптер (Adapter)
Оболочка (Wrapper)
Заместитель (Proxy)
Компоновщик (Composite)
Мост (Bridge)
Приспособленец (Flyweight)
Фасад (Facade)


Слайд 10

Адаптер (Adapter)

Адаптер (Adapter)

Слайд 11

Адаптер - Проблема Необходимо обеспечить взаимодействие несовместимых интерфейсов или как создать

Адаптер - Проблема

Необходимо обеспечить взаимодействие несовместимых интерфейсов или как создать единый

устойчивый интерфейс для нескольких компонентов с разными интерфейсами.
Слайд 12

Адаптер - Решение Конвертировать исходный интерфейс компонента к другому виду с

Адаптер - Решение

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

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

Адаптер – Структура

Адаптер – Структура

Слайд 14

Адаптер - Пример

Адаптер - Пример

Слайд 15

Адаптер - Применимость Необходимо использовать существующий класс, но его интерфейс не

Адаптер - Применимость

Необходимо использовать существующий класс, но его интерфейс не соответствует

заданным требованиям
Создание повторно используемого класса, который должен взаимодействовать с заранее неизвестными или не связанными с ним классами, имеющими несовместимые интерфейсы
Использование нескольких существующих подклассов, приспосабливая интерфейс их общего родительского класса (только для адаптера объектов)
Слайд 16

Оболочка (Wrapper)

Оболочка (Wrapper)

Слайд 17

Оболочка - Проблема Возложить дополнительные обязанности (прозрачные для клиентов) на отдельный

Оболочка - Проблема

Возложить дополнительные обязанности (прозрачные для клиентов) на отдельный объект,

а не на класс в целом.
Слайд 18

Оболочка - Рекомендации Применение нескольких «Оболочек" к одному "Компоненту" позволяет произвольным

Оболочка - Рекомендации

Применение нескольких «Оболочек" к одному "Компоненту" позволяет произвольным образом

сочетать обязанности, например, одно свойство можно добавить дважды.
Слайд 19

Оболочка - Решение Динамически добавить объекту новые обязанности не прибегая при

Оболочка - Решение

Динамически добавить объекту новые обязанности не прибегая при этом

к порождению подклассов (наследованию). «Компонент» определяет интерфейс для объектов, на которые могут быть динамически возложены дополнительные обязанности, «Конкретный Компонент» определяет объект, на который возлагаются дополнительные обязанности, «Оболочка» - хранит ссылку на объект "Компонент" и определяет интерфейс, соответствующий интерфейсу "Компонента". "Конкретная Оболочка" возлагает дополнительные обязанности на компонент. «Оболочка" переадресует запросы объекту "Компонент".
Слайд 20

Оболочка - Структура

Оболочка - Структура

Слайд 21

Оболочка - Преимущество Большая гибкость, чем у статического наследования: можно добавлять

Оболочка - Преимущество

Большая гибкость, чем у статического наследования: можно добавлять и

удалять обязанности во время выполнения программы в то время как при использовании наследования надо было бы создавать новый класс для каждой дополнительной обязанности. Данный паттерн позволяет избежать перегруженных методами классов на верхних уровнях иерархии - новые обязанности можно добавлять по мере необходимости.
Слайд 22

Оболочка - Недостатки «Оболочка» и его "Компонент" не идентичны, и, кроме

Оболочка - Недостатки

«Оболочка» и его "Компонент" не идентичны, и, кроме того,

получается что система состоит из большого числа мелких объектов, которые похожи друг на друга и различаются только способом взаимосвязи, а не классом и не значениями своих внутренних переменных - такая система сложна в изучении и отладке.
Слайд 23

Заместитель (Proxy)

Заместитель (Proxy)

Слайд 24

Заместитель - Проблема Необходимо управлять доступом к объекту, так чтобы создавать громоздкие объекты "по требованию".

Заместитель - Проблема

Необходимо управлять доступом к объекту, так чтобы создавать громоздкие

объекты "по требованию".
Слайд 25

Заместитель - Решение Создать суррогат громоздкого объекта. "Заместитель" хранит ссылку, которая

Заместитель - Решение

Создать суррогат громоздкого объекта. "Заместитель" хранит ссылку, которая позволяет

заместителю обратиться к реальному субъекту (объект класса "Заместитель" может обращаться к объекту класса "Субъект", если интерфейсы "РеальногоСубъекта" и "Субъекта" одинаковы). Поскольку интерфейс "РеальногоСубъекта" идентичен интерфейсу "Субъекта", так, что "Заместителя" можно подставить вместо "РеальногоСубъекта", контролирует доступ к "РеальномуСубъекту", может отвечать за создание или удаление "РеальногоСубъекта". "Субъект" определяет общий для "РеальногоСубъекта" и "Заместителя" интерфейс, так, что "Заместитель" может быть использован везде, где ожидается "РеальныйСубъект". При необходимости запросы могут быть переадресованы "Заместителем" "РеальномуСубъекту".
Слайд 26

Заместитель - Структура

Заместитель - Структура

Слайд 27

Заместитель – Виды Удаленный заместитель : обеспечивает связь с «Субъектом», который

Заместитель – Виды

Удаленный заместитель : обеспечивает связь с «Субъектом», который находится

в другом адресном пространстве или на удалённой машине. Так же может отвечать за кодирование запроса и его аргументов и отправку закодированного запроса реальному «Субъекту».
Виртуальный заместитель обеспечивает создание реального «Субъекта» только тогда, когда он действительно понадобится. Так же может кэшировать часть информации о реальном «Субъекте», чтобы отложить его создание.
Копировать-при-записи: обеспечивает копирование «субъекта» при выполнении клиентом определённых действий.
Защищающий заместитель: может проверять, имеет ли вызывающий объект необходимые для выполнения запроса права.
Кэширующий прокси: обеспечивает временное хранение результатов расчёта до отдачи их множественным клиентам, которые могут разделить эти результаты.
Экранирующий прокси: защищает «Субъект» от опасных клиентов (или наоборот).
Синхронизирующий прокси: производит синхронизированный контроль доступа к «Субъекту» в асинхронной многопоточной среде.
Smart reference proxy: производит дополнительные действия, когда на «Субъект» создается ссылка, например, рассчитывает количество активных ссылок на «Субъект».
Слайд 28

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

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

Слайд 29

Компоновщик - Проблема Как обрабатывать группу или композицию структур объектов одновременно?

Компоновщик - Проблема

Как обрабатывать группу или композицию структур объектов одновременно?

Слайд 30

Компоновщик - Решение Определить классы для композитных и атомарных объектов таким

Компоновщик - Решение

Определить классы для композитных и атомарных объектов таким образом,

чтобы они реализовывали один и тот же интерфейс.
Слайд 31

Компоновщик - Структура

Компоновщик - Структура

Слайд 32

Компоновщик - Использование Необходимо объединять группы схожих объектов и управлять ими.

Компоновщик - Использование

Необходимо объединять группы схожих объектов и управлять ими.
Объекты могут

быть как примитивными (элементарными), так и составными (сложными). Составной объект может включать в себя коллекции других объектов, образуя сложные древовидные структуры. Пример: директория файловой системы состоит из элементов, каждый их которых также может быть директорией.
Код клиента работает с примитивными и составными объектами единообразно.
Слайд 33

Мост (Bridg)

Мост (Bridg)

Слайд 34

Мост - Проблема Требуется отделить абстракцию от реализации так, чтобы и

Мост - Проблема

Требуется отделить абстракцию от реализации так, чтобы и то

и другое можно было изменять независимо. При использовании наследования реализация жестко привязывается к абстракции, что затрудняет независимую модификацию.
Слайд 35

Мост - Решение Поместить абстракцию и реализацию в отдельные иерархии классов.

Мост - Решение

Поместить абстракцию и реализацию в отдельные иерархии классов.

Слайд 36

Мост - Рекомендации Можно использовать если, например, реализацию необходимо выполнять во время реализации программы.

Мост - Рекомендации

Можно использовать если, например, реализацию необходимо выполнять во время

реализации программы.
Слайд 37

Мост - Решение "Абстракция" определяет интерфейс "Абстракции" и хранит ссылку на

Мост - Решение

"Абстракция" определяет интерфейс "Абстракции" и хранит ссылку на объект

"Реализация", "УточненнаяАбстракция" расширяет интерфейс, определенный "Абстракцией". "Реализация" определяет интерфейс для классов реализации, он не обязан точно соответствовать интерфейсу класса "Абстракция" - оба интерфейса могут быть совершенно различны. Обычно интерфецйс класса "Реализация" предоставляет только примитивные операции, а класс "Абстракция" определяет операции более высокого уровня, базирующиеся на этих примитивных. "КонкретнаяРеализация" содержит конкретную реализацию класса "Реализация". Объект "Абстракция" перенаправляет своему объекту "Реализация" запросы "Клиента".
Слайд 38

Мост - Структура

Мост - Структура

Слайд 39

Мост – Преимущество Отделение реализации от интерфейса, то есть, "Реализацию" "Абстракции"

Мост – Преимущество

Отделение реализации от интерфейса, то есть, "Реализацию" "Абстракции" можно

конфигурировать во время выполнения. Кроме того, следует упомянуть, что разделение классов "Абстракция" и "Реализация" устраняет зависимости от реализации, устанавливаемые на этапе компиляции: чтобы изменить класс "Реализация" вовсе не обязательно перекомпилировать класс "Абстракция".
Слайд 40

Приспособленец (Flyweight)

Приспособленец (Flyweight)

Слайд 41

Приспособленец - Проблема Необходимо обеспечить поддержку множества мелких объектов.

Приспособленец - Проблема

Необходимо обеспечить поддержку множества мелких объектов.

Слайд 42

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

Приспособленец - Рекомендации

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

объектами. Имеет смысл использовать данный паттерн если одновременно выполняются следующие условия:
в приложении используется большое число объектов, из-за этого расходы на хранение высоки;
большую часть состояния объектов можно вынести вовне;
многие группы объектов можно заменить относительно небольшим количеством объектов, поскольку состояния объектов вынесены вовне.
Слайд 43

Приспособленец – Решение(1) Создать разделяемый объект, который можно использовать одновременно в

Приспособленец – Решение(1)

Создать разделяемый объект, который можно использовать одновременно в нескольких

контекстах, причем, в каждом контексте он выглядит как независимый объект (неотличим от экземпляра, который не разделяется). «Приспособленец» объявляет интерфейс, с помощью которого приспособленцы могут получить внешнее состояние или как-то воздействовать на него, "КонкретныйПриспособленец" реализует интерфейс класса "Приспособленец" и добавляет при необходимости внутреннее состояние. Внутреннее состояние хранится в объекте "КонкретныйПриспособленец", в то время как внешнее состояние хранится или вычисляется "Клиентами" ("Клиент" передает его "Приспособленцу" при вызове операций).
Слайд 44

Приспособленец – Решение(2) Объект класса "КонкретныйПриспособленец" должен быть разделяемым. Любое сохраняемое

Приспособленец – Решение(2)

Объект класса "КонкретныйПриспособленец" должен быть разделяемым. Любое сохраняемое им

состояние должно быть внутренним, то есть независимым от контекста, "ПриспособленецФабрика" - создает объекты - "Приспособленцы" (или предоставляет существующий экземпляр) и управляет ими. "НеразделяемыйКонкретныйПриспособленец" - не все подклассы "Приспособленца" обязательно должны быть разделяемыми. "Клиент" - хранит ссылки на одного или нескольких "Приспособленцев", вычисляет и хранит внешнее состояние "Приспособленцев".
Слайд 45

Приспособленец - Структура

Приспособленец - Структура

Слайд 46

Приспособленец - Преимущества Вследствие уменьшения общего числа экземпляров и вынесения состояния экономится память.

Приспособленец - Преимущества

Вследствие уменьшения общего числа экземпляров и вынесения состояния экономится

память.
Слайд 47

Фасад (Facade)

Фасад (Facade)

Слайд 48

Фасад - Проблема Как обеспечить унифицированный интерфейс с набором разрозненных реализаций

Фасад - Проблема

Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или

интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Слайд 49

Фасад - Решение Определить одну точку взаимодействия с подсистемой - фасадный

Фасад - Решение

Определить одну точку взаимодействия с подсистемой - фасадный объект,

обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с ее компонентами. Фасад - это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам.
Слайд 50

Фасад - Структура

Фасад - Структура

Слайд 51

Паттерны проектирования поведения классов/объектов Интерпретатор Итератор Команда Наблюдатель Посетитель Посредник Состояние

Паттерны проектирования поведения классов/объектов

Интерпретатор
Итератор
Команда
Наблюдатель
Посетитель
Посредник
Состояние
Стратегия
Хранитель
Цепочка обязанностей
Шаблонный метод

Слайд 52

Интерпретатор

Интерпретатор

Слайд 53

Интерпретатор - Проблема Имеется часто встречающаяся, подверженная изменениям задача.

Интерпретатор - Проблема

Имеется часто встречающаяся, подверженная изменениям задача.

Слайд 54

Интерпретатор - Решение Создать интерпретатор, который решает данную задачу.

Интерпретатор - Решение

Создать интерпретатор, который решает данную задачу.

Слайд 55

Интерпретатор - Пример Задача поиска строк по образцу может быть решена

Интерпретатор - Пример

Задача поиска строк по образцу может быть решена посредством

создания интерпретатора, определяющего грамматику языка.
Слайд 56

Интерпретатор - Структура

Интерпретатор - Структура

Слайд 57

Интерпретатор - Преимущества Грамматику становится легко расширять и изменять, реализации классов,

Интерпретатор - Преимущества

Грамматику становится легко расширять и изменять, реализации классов, описывающих

узлы абстрактного синтаксического дерева похожи (легко кодируются). Можно легко изменять способ вычисления выражений.
Слайд 58

Интерпретатор - Недостатки Сопровождение грамматики с большим числом правил затруднительно.

Интерпретатор - Недостатки

Сопровождение грамматики с большим числом правил затруднительно.

Слайд 59

Итератор (Iterator)

Итератор (Iterator)

Слайд 60

Итератор - Проблема Составной объект, например, список, должен предоставлять доступ к

Итератор - Проблема

Составной объект, например, список, должен предоставлять доступ к своим

элементам (объектам), не раскрывая их внутреннюю структуру, причем перебирать список требуется по-разному в зависимости от задачи.
Слайд 61

Итератор - Решение Создается класс "Итератор", коорый определяет интерфейс для доступа

Итератор - Решение

Создается класс "Итератор", коорый определяет интерфейс для доступа и

перебора элементов, "КонкретныйИтератор" реализует интерфейскласса "Итератор" и следит за текущей позицией при обходе "Агрегата". "Агрегат" определяет интерфейс для создания объекта - итератора. "КонкретныйАгрегат" реализует интерфейс создания итератора и возвращает экземпляр класса "КонкретныйИтератор", "КонкретныйИтератор" отслеживает текущий объект в агрегате и может вычислить следующий объект при переборе.
Слайд 62

Итератор - Структура

Итератор - Структура

Слайд 63

Итератор - Преимущества Поддерживает различные способы перебора агрегата, одновременно могут быть активны несколько переборов.

Итератор - Преимущества

Поддерживает различные способы перебора агрегата, одновременно могут быть активны

несколько переборов.
Слайд 64

Команда (Command)

Команда (Command)

Слайд 65

Команда- Проблема Необходимо послать объекту запрос, не зная о том, выполнение

Команда- Проблема

Необходимо послать объекту запрос, не зная о том, выполнение какой

операции запрошено и кто будет получателем.
Слайд 66

Команда- Решение Инкапсулировать запрос как объект. "Клиент" создает объект "КонкретнаяКоманда", который

Команда- Решение

Инкапсулировать запрос как объект. "Клиент" создает объект "КонкретнаяКоманда", который вызывает

операции получателя для выполнения запроса, "Инициатор" отправляет запрос, выполоняя операцию "Команды" Выполнить(). "Команда" объявляет интерфейс для выполнения операции, "КонкретнаяКоманда" определяет связь между объектом "Получатель" и операцией Действие(), и, кроме того, реализует операцию Выполнить() путем вызова соответствующих операций объекта "Получатель". "Клиент" создает экземпляр класса "КонкретнаяКоманда" и устанавливает его получателя, "Инициатор" обращается к команде для выполнения запроса, "Получатель" (любой класс) располагает информацией о способах выполнения операций, необходимых для выполнения запроса.
Слайд 67

Команда - Структура

Команда - Структура

Слайд 68

Команда- Преимущество Паттерн "Команда" разрывает связь между объектом, инициирующим операции, и

Команда- Преимущество

Паттерн "Команда" разрывает связь между объектом, инициирующим операции, и объектом,

имеющим информацию о том, как ее выполнить, кроме того создается объект "Команда", который можно расширять и манипулировать им как объектом.
Слайд 69

Наблюдатель (Observer)

Наблюдатель (Observer)

Слайд 70

Наблюдатель - Проблема Один объект ("Подписчик") должен знать об изменении состояний

Наблюдатель - Проблема

Один объект ("Подписчик") должен знать об изменении состояний или

некоторых событиях другого объекта. При этом необходимо поддерживать низкий уровень связывания с объектом - "Подписчиком".
Слайд 71

Наблюдатель - Решение Определить интерфейс "Подписки". Объекты - подписчики реализуют этот

Наблюдатель - Решение

Определить интерфейс "Подписки". Объекты - подписчики реализуют этот интерфейс

и динамически регистрируются для получении информации о некотором событии. Затем при реализации условленного события оповещаются все объекты - подписчики.
Слайд 72

Наблюдатель - Структура

Наблюдатель - Структура

Слайд 73

Посетитель (Visitor)

Посетитель (Visitor)

Слайд 74

Посетитель- Проблема Над каждым объектом некоторой структуры выполняется операция. Определить новую операцию, не изменяя классы объектов.

Посетитель- Проблема

Над каждым объектом некоторой структуры выполняется операция. Определить новую операцию,

не изменяя классы объектов.
Слайд 75

Посетитель- Решение Клиент, использующий данный паттерн, должен создать объект класса "КонкретныйПосетитель",

Посетитель- Решение

Клиент, использующий данный паттерн, должен создать объект класса "КонкретныйПосетитель", а

затем посетить каждый элемент структуры. "Посетитель" объявляет операцию "Посетить" для каждого класса "КонкретныйЭлемент" (имя и сигнатура данной операции идентифицируют класс, элемент которого посещает "Посетитель" - то есть, посетитель может обращаться к элементу напрямую). "КонкретныйПосетитель" реализует все операции, обьявленные в классе "Посетитель". Каждая операция реализует фрагмент алгоритма, определенного для класса соответствующего объекта в структуре.
Класс "КонкретныйПосетитель"предоставляет контекст для этого алгоритма и сохраняет его локальное состояние. "Элемент" определяет операцию "Принять", которая принимает "Посетителя" в качестве аргумента, "КонкретныйЭлемент" реализует операцию "Принять", которая принимает "Посетителя" в качестве аргумента. "СтруктураОбьекта" может перечислить свои аргументы и предоставить посетителю высокоуровневый интерфейс для посещения своих элементов.
Слайд 76

Посетитель- Структура

Посетитель- Структура

Слайд 77

Посетитель- Рекомендации Логично использовать, если в структуре присутствуют объекты многих классов

Посетитель- Рекомендации

Логично использовать, если в структуре присутствуют объекты многих классов с

различными интерфейсами, и необходимо выполнить над ними операции, зависящие от конкретных классов, или если классы, устанавливающие структуру обьектов изменяются редко, но новые операции над этой структурой добавляются часто.
Слайд 78

Посетитель- Преимущества Упрощается добавление новых операций, объединяет родственные операции в классе "Посетитель".

Посетитель- Преимущества

Упрощается добавление новых операций, объединяет родственные операции в классе "Посетитель".

Слайд 79

Посетитель- Недостатки Затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной операции в классе "Посетитель".

Посетитель- Недостатки

Затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной

операции в классе "Посетитель".
Слайд 80

Посредник (Mediator)

Посредник (Mediator)

Слайд 81

Посредник- Проблема Затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной операции в классе "Посетитель".

Посредник- Проблема

Затруднено добавление новых классов "КонкретныйЭлемент", поскольку требуется объявление новой абстрактной

операции в классе "Посетитель".
Слайд 82

Посредник- Решение Посредник" определяет интерфейс для обмена информацией с объектами "Коллеги",

Посредник- Решение

Посредник" определяет интерфейс для обмена информацией с объектами "Коллеги", "КонкретныйПосредник"

координирует действия обьектов "Коллеги". Каждый класс "Коллеги" знает о своем объекте "Посредник", все "Коллеги" обмениваются информацией только с посредником, при его отсутствии им пришлось бы обмениваться информацией напрямую. "Коллеги" посылают запросы посреднику и получают запросы от него. "Посредник" реализует кооперативное поведения, пересылая каждый запрос одному или нескольким "Коллегам".
Слайд 83

Посредник- Структура

Посредник- Структура

Слайд 84

Посредник - Преимущества Устраняется связанность между "Коллегами", централизуется управление.

Посредник - Преимущества

Устраняется связанность между "Коллегами", централизуется управление.

Слайд 85

Состояние (State)

Состояние (State)

Слайд 86

Состояние - Проблема Варьировать поведение объекта в зависимости от его внутреннего состояния

Состояние - Проблема

Варьировать поведение объекта в зависимости от его внутреннего состояния

Слайд 87

Состояние - Решение Класс "Контекст" делегирует зависящие от состояния запросы текущему

Состояние - Решение

Класс "Контекст" делегирует зависящие от состояния запросы текущему объекту

"КонкретноеСостояние" (хранит экземпляр подкласса "КонкретноеСостояние", которым определяется текущее состояние), и определяет интерфейс, представляющий интерес для клиентов. "КонкретноеСостояние" реализует поведение, ассоциированное с неким состоянием объекта "Контекст". "Состояние" определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным экземпляром "Контекста".
Слайд 88

Состояние - Структура

Состояние - Структура

Слайд 89

Состояние - Преимущества Локализует зависящее от состояния поведение и делит его

Состояние - Преимущества

Локализует зависящее от состояния поведение и делит его на

части, соответствующие состояниям, переходы между состояниями становятся явными.
Слайд 90

Стратегия (Strategy)

Стратегия (Strategy)

Слайд 91

Стратегия - Проблема Спроектировать изменяемые, но надежные алгоритмы или стратегии

Стратегия - Проблема

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

Слайд 92

Стратегия - Решение Определить для каждого алгоритма или стратегии отдельный класс со стандартным интерфейсом.

Стратегия - Решение

Определить для каждого алгоритма или стратегии отдельный класс со

стандартным интерфейсом.
Слайд 93

Стратегия - Пример Обеспечение сложной логики вычисления стоимости товаров с учетом

Стратегия - Пример

Обеспечение сложной логики вычисления стоимости товаров с учетом сезонных

скидок, скидок постоянным клиентам и т. п. Данная стратегия может изменяться.
Создается несколько классов "Стратегия", каждый из которых содержит один и тот же полиморфный метод "ЦенаРассчитать". В качестве параметров в этот метод передаются данные о продаже. Объект стратегии связывается с контекстным объектом (тем объектом, к которому применяется алгоритм).
Слайд 94

Стратегия - Структура

Стратегия - Структура

Слайд 95

Хранитель (Memento)

Хранитель (Memento)

Слайд 96

Хранитель - Проблема Необходимо зафиксировать поведение объекта для реализации, например, механизма отката.

Хранитель - Проблема

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

Слайд 97

Хранитель - Решение Зафиксировать и вынести (не нарушая инкапсуляции) за пределы

Хранитель - Решение

Зафиксировать и вынести (не нарушая инкапсуляции) за пределы объекта

его внутреннее состояние так, чтобы впоследствии можно было восстановить в нем объект. "Хранитель" сохраняет внутреннее состояние объекта "Хозяин" и запрещает доступ к себе всем другим объектам кроме "Хозяина", который имеет доступ ко всем данным для восстановления в прежнем состоянии. "Посыльный" может лишь передавать "Хранителя" другим объектам. "Хозяин" создает "Хранителя", содержащего снимок текущего внутреннего состояния и использует "Хранитель" для восстановления внутреннего состояния. "Посыльный" отвечает за сохранение "Хранителя", при этом не производит никаких операций над "Хранителем" и не исследует его внутреннее содержимое. "Посыльный" запрашивает "Хранитель" у "Хозяина", некоторое время держит его у себя, а затем возвращает "Хозяину".
Слайд 98

Хранитель - Структура

Хранитель - Структура

Слайд 99

Хранитель - Преимущества Не раскрывается информация, которая доступна только "Хозяину", упрощается структура "Хозяина".

Хранитель - Преимущества

Не раскрывается информация, которая доступна только "Хозяину", упрощается структура

"Хозяина".
Слайд 100

Хранитель - Недостатки С использованием "Хранителей" могут быть связаны значительные издержки,

Хранитель - Недостатки

С использованием "Хранителей" могут быть связаны значительные издержки, если

"Хозяин" должен копировать большой объём информации, или если копирование должно проводиться часто.
Слайд 101

Цепочка обязанностей (Chain of Responsibility)

Цепочка обязанностей (Chain of Responsibility)

Слайд 102

Цепочка обязанностей - Проблема Запрос должен быть обработан несколькими объектами.

Цепочка обязанностей - Проблема

Запрос должен быть обработан несколькими объектами.

Слайд 103

Цепочка обязанностей - Рекомендации Логично использовать данный паттерн, если имеется более

Цепочка обязанностей - Рекомендации

Логично использовать данный паттерн, если имеется более одного

объекта, способного обработать запрос и обработчик заранее неизвестен (и должен быть найден автоматически) или если весь набор обьектов, которые способны обработать запрос, должен задаваться автоматически.
Слайд 104

Цепочка обязанностей - Решение Связать объекты - получатели запроса в цепочку

Цепочка обязанностей - Решение

Связать объекты - получатели запроса в цепочку и

передать запрос вдоль этой цепочки, пока он не будет обработан. "Обработчик" определяет интерфейс для обработки запросов, и, возможно, реализует связь с преемником, "КонкретныйОбработчик" обрабатывает запрос, за который отвечает, имеет доступ к своему преемнику ("КонкретныйОбработчик" направляет запрос к своему преемнику, если не может обработать запрос сам.
Слайд 105

Цепочка обязанностей - Структура

Цепочка обязанностей - Структура

Слайд 106

Цепочка обязанностей - Преимущества Ослабляется связанность (объект не обязан "знать", кто именно обработает его запрос).

Цепочка обязанностей - Преимущества

Ослабляется связанность (объект не обязан "знать", кто именно

обработает его запрос).
Слайд 107

Цепочка обязанностей - Недостатки Нет гарантий, что запрос будет обработан, поскольку он не имеет явного получателя.

Цепочка обязанностей - Недостатки

Нет гарантий, что запрос будет обработан, поскольку он

не имеет явного получателя.
Слайд 108

Шаблонный метод (Template Method)

Шаблонный метод (Template Method)

Слайд 109

Шаблонный метод - Проблема Определить алгоритм и реализовать возможность переопределения некоторых

Шаблонный метод - Проблема

Определить алгоритм и реализовать возможность переопределения некоторых шагов

алгоритма для подклассов (без изменения общей структуры алгоритма.
Слайд 110

Шаблонный метод - Решение АбстрактныйКласс" определяет абстрактные Операции(), замещаемые в конкретных

Шаблонный метод - Решение

АбстрактныйКласс" определяет абстрактные Операции(), замещаемые в конкретных подклассах

для реализации шагов алгоритма, и реализует ШаблонныйМетод(), определяющий "скелет" алгоритма. "КонкретныйКласс" релизует Операции(), выполняющие шаги алгоритма способом, который зависит от подкласса. "КонкретныйКласс" предполагает, что инвариантные шаги алгоритма будут выполнены в "АбстрактномКлассе".
Слайд 111

Шаблонный метод - Структура

Шаблонный метод - Структура

Слайд 112

Порождающие паттерны проектирования Абстрактная фабрика Одиночка Прототип Строитель Фабричный метод

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

Абстрактная фабрика
Одиночка
Прототип
Строитель
Фабричный метод

Слайд 113

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

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

Слайд 114

Абстрактная фабрика – Проблема Создать семейство взаимосвязанных или взаимозависимых обьектов (не специфицируя их конкретных классов).

Абстрактная фабрика – Проблема

Создать семейство взаимосвязанных или взаимозависимых обьектов (не специфицируя

их конкретных классов).
Слайд 115

Абстрактная фабрика – Решение Создать абстрактный класс, в котором объявлен интерфейс для создания конкретных классов.

Абстрактная фабрика – Решение

Создать абстрактный класс, в котором объявлен интерфейс для

создания конкретных классов.
Слайд 116

Абстрактная фабрика – Структура

Абстрактная фабрика – Структура

Слайд 117

Абстрактная фабрика – Преимущества Изолирует конкретные классы. Поскольку "Абстрактная фабрика" инкапсулирует

Абстрактная фабрика – Преимущества

Изолирует конкретные классы. Поскольку "Абстрактная фабрика" инкапсулирует ответственность

за создание классов и сам процесс их создания, то она изолирует клиента от деталей реализации классов. Упрощена замена "Абстрактной фабрики", поскольку она используется в приложении только один раз при инстанцировании.
Слайд 118

Абстрактная фабрика – Недостатки Интерфейс "Абстрактной фабрики" фиксирует набор обьектов, которые

Абстрактная фабрика – Недостатки

Интерфейс "Абстрактной фабрики" фиксирует набор обьектов, которые можно

создать. Расширение "Абстрактной фабрики" для изготовления новых обьектов часто затруднительно.
Слайд 119

Одиночка (Singleton)

Одиночка (Singleton)

Слайд 120

Одиночка - Проблема Создать класс и определить статический метод класса, возвращающий этот единственный объект.

Одиночка - Проблема

Создать класс и определить статический метод класса, возвращающий этот

единственный объект.
Слайд 121

Одиночка - Решение Интерфейс "Абстрактной фабрики" фиксирует набор обьектов, которые можно

Одиночка - Решение

Интерфейс "Абстрактной фабрики" фиксирует набор обьектов, которые можно создать.

Расширение "Абстрактной фабрики" для изготовления новых обьектов часто затруднительно.
Слайд 122

Слайд 123

Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые

Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые

методы статическими, поскольку при использовании методов экземпляра можно применить механизм наследования и создавать подклассы. Статические методы в языках программирования не полиморфны и не допускают перекрытия в производных классах.
Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не единственный экземпляр объекта, а несколько.
Слайд 124

Слайд 125

Система не должна зависеть от того, как в ней создаются, компонуются и представляются объекты.

Система не должна зависеть от того, как в ней создаются, компонуются

и представляются объекты.
Слайд 126

Создавать новые объекты с помощью паттерна - прототипа. "Прототип" объявляет интерфейс

Создавать новые объекты с помощью паттерна - прототипа. "Прототип" объявляет интерфейс

для клонирования самого себя. "Клиент" создает новый объект, обращаясь к "Прототипу" с запросом клонировать "Прототип".
Слайд 127

Слайд 128

Слайд 129

Отделить конструирование сложного объекта от его представления, так чтобы в результате

Отделить конструирование сложного объекта от его представления, так чтобы в результате

одного и того же конструирования могли получаться различные представления. Алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой.
Слайд 130

"Клиент" создает объект - распорядитель "Директор" и конфигурирует его объектом -

"Клиент" создает объект - распорядитель "Директор" и конфигурирует его объектом -

"Строителем". "Директор" уведомляет "Строителя" о том, что нужно построить очередную часть "Продукта". "Строитель" обрабатывает запросы "Директора" и добавляет новые части к "Продукту", затем "Клиент" забирает "Продукт" у "Строителя".
Слайд 131

Слайд 132

Объект "Строитель" предоставляет объекту "Директор" абстрактный интерфейс для конструирования "Продукта", за

Объект "Строитель" предоставляет объекту "Директор" абстрактный интерфейс для конструирования "Продукта", за

которым может скрыть представление и внутреннюю структуру продукта, и , кроме того, процесс сборки "продукта". Для изменения внутреннего представления "Продукта" достаточно определить новый вид "Строителя". Данный паттерн изолирует код, реализующий создание объекта и его представление.
Слайд 133

Слайд 134

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

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

какой класс инстанцировать, то есть, делегировать инстанцирование подклассам.
Слайд 135

Абстрактный класс "Создатель" объявляет ФабричныйМетод, возвращающий объект типа "Продукт" (абстрактный класс,

Абстрактный класс "Создатель" объявляет ФабричныйМетод, возвращающий объект типа "Продукт" (абстрактный класс,

определяющий интерфейс обьектов, создаваемых фабричным методом). "Создатель также может определить реализацию по умолчанию ФабричногоМетода, который возвращает "КонкретныйПродукт". "КонкретныйСоздатель" замещает ФабричныйМетод, возвращающий объект "КонкретныйПродукт". "Создатель" "полагается" на свои подклассы в определении ФабричногоМетода, возвращающего объект "КонкретныйПродукт".
Слайд 136

Слайд 137

Избавляет проектировщика от необходимости встраивать в код зависящие от приложения классы.

Избавляет проектировщика от необходимости встраивать в код зависящие от приложения классы.

Слайд 138

Возникает дополнительный уровень подклассов.

Возникает дополнительный уровень подклассов.