software engineering ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...java api string...

104
Software Engineering I Объектно-ориентированный анализ и проектирование Раздел 5. Паттерны проектирования: разновидности и примеры

Upload: others

Post on 20-Nov-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Software Engineering IОбъектно-ориентированный

анализ и проектирование

Раздел 5. Паттерны

проектирования: разновидности

и примеры

Page 2: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

План раздела

• Классификация▫ Основные паттерны

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

▫ Разделяющие (структурные) паттерны

▫ Другие структурные паттерны

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

▫ Паттерны для конкурирующих операций

▫ Паттерны, возникающие при решении прикладных задач

▫ …

Page 3: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation

Interface

Abstract Superclass

Immutable

Proxy

Page 4: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Контекст

▫ Моделирование ролей: наследование подходит

не лучшим образом

Page 5: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Контекст

▫ Один и тот же субъект может играть

комбинации ролей:

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

отношений (наследование)

Тип объекта не изменяется со временем

Модель требует динамического характера

отношений (role-played-by)

Объект может делегировать поведение разным

объектам в разные моменты времени

Page 6: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Суть решения

▫ Объект делегирует ответственность по

выполнению роли некоторому объекту

▫ Делегирование – более общий механизм

Page 7: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Мотивы▫ Необходимость представления объекта

разными подклассами в разные моменты времени

▫ Проблема сокрытия унаследованных методов

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

▫ Реализация делегирования требует больше кода

▫ Ухудшается структура

Page 8: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Структура решения

▫ Делегирование применяется в случае

необходимости многократного использования

характеристик поведения и расширения класса

▫ Любое расширение, которое может быть

выполнено при помощи наследования, может

быть также выполнено при помощи

делегирования

Page 9: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Примеры

▫ Java API

Делегирование событий

Каждый объект-источник события посылает

сообщения объектам-слушателям. Объект-источник

как правило не решает, что делать с этим событием, а

делегирует ответственность объектам-слушателям

Page 11: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Delegation (Делегирование)

• Связь с другими шаблонами

▫ Почти любой паттерн использует делегирование

Decorator

Proxy

▫ Применение совместно с паттерном Interface

может обеспечивать лучшую структуру кода для

использования и понимания

Page 12: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Контекст и суть

решения

▫ Управление

информацией о

почтовых адресах

для разных

объектов

Одинаковая

структура, разные

реализации

Page 13: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Мотивы

▫ Необходимость использования одним

объектом другого для получения данных или

сервисов без указания того, к какому классу

принадлежит используемый объект

▫ Изменения реализации не должны затрагивать

пользователей объекта

▫ Конструкторы не могут быть доступны через

интерфейс

Page 14: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Структура решения

▫ Использование интерфейсов позволяет сделать

зависимость одного класса от другого косвенной

характеристик поведения и расширения класса

Page 15: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Комментарий к реализации

▫ Если требуется создание объектов, тип которых

на неизвестен, используют механизмы

отражения (reflection)

• Следствия

▫ Класс, нуждающийся в сервисе другого класса,

не привязан к конкретной реализации

▫ Усложнение программы для понимания

Page 16: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Пример

▫ Java API

Интерфейс FilenameFilter

метод boolean accept( File f )

метод String getDescription()

Класс JFileChooser

метод addChoosableFileFilter(

FilenameFilter filter)

Page 17: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Interface (Интерфейс)

• Связь с другими шаблонами

▫ Часто используется вместе с шаблоном

Delegation

▫ Является основой шаблона Strategy

▫ Основа иерархии наследования в Java

Page 18: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Superclass (абстрактный

суперкласс)• Контекст

▫ Имеется

набор

классов,

частично

имеющих

общую

логику

выполнения

методов.

Page 19: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Superclass (абстрактный

суперкласс)• Структура решения

и реализация

▫ Общие методы

реализуются в

суперклассе

▫ Открытые общие

методы могут быть

помещены в

интерфейс

Page 20: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Superclass (абстрактный

суперкласс)• Следствия

▫ Уменьшается количество кода в каждом из

классов, исключается дублирование кода

▫ Упрощается тестирование иерархии классов

▫ Общая логика функционирования отделяется

от конкретных отличий

▫ Появляется зависимость между суперклассом

и его подклассами

Page 21: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Superclass (абстрактный

суперкласс)• Связь с другими

шаблонами

▫ Часто

используется в

комбинации с

шаблоном

Interface (шаблон

Interface and

Abstract Class)

Page 22: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Superclass (абстрактный

суперкласс)• Пример

▫ Простая инфраструктура для unit-тестов

▫ Java API

junit

иерархия оконных классов abstract class Component

▫ Container < Window < Frame < JFrame

классы событий

Page 23: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Контекст

▫ Объекты значений

▫ Множество объектов имеет доступ к одному и

тому же объекту =>ненадлежащая

скоординированность между объектами

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

внимания и является источником ошибок

▫ В частности, важно для многопоточночти

Page 24: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Контекст

▫ Пример возможной проблемы при

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

Date d = new Date(); Scheduler.scheduleTask(task1, d); d.setTime(d.getTime() + ONE_DAY); scheduler.scheduleTask(task2, d);

Date d = new Date();

Scheduler.scheduleTask(task1, d);

d.setTime(d.getTime() + ONE_DAY);

scheduler.scheduleTask(task2, d);

Page 25: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Рекомендации по реализации▫ Все поля являются final

▫ Класс является final

▫ Любые поля, содержащие ссылки на изменяемые объекты: private

никогда не возвращаются и не становятся доступными вызывающему коду

являются единственными ссылками на те объекты, на которые ссылаются (используйте clone())

не изменяют после конструирования состояния объектов, на которые ссылаются

Page 26: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Примеры▫ Java API String – использование неизменяемых строк проще Класс String не содержит методов для изменения

содержимого строки

Методы класса String, вычисляющие новое значение,всегда возвращают новый объект класса String

Классы-оболочки (Integer, Double, Character, … )

Класс Pattern для поиска регулярных выражений

▫ Сохранение позиции в некоторой игре Для анализа с возможностью восстановления

Page 27: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Следствия▫ Поскольку состояние объекта не изменяется, не нужен

код для обработки изменений

▫ Неизменный объект часто используется для значения атрибута другого объекта. В этом случае нет необходимости в синхронизации доступа к атрибутам объекта

▫ Паттерн Immutable повышает надежность работы с объектами, разделяющих ссылки на один и тот же объект

▫ Операции, которые могли бы изменить состояние объекта, вынуждены создавать новый объект. Это может вести к большему расходованию ресурсов памяти

Page 28: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Immutable (неизменный)

• Пример

▫ Java API

String – манипулирование строками сильно

упрощается, все «модифицирующие» методы

формируют новый объект String

Классы-оболочки

▫ Позиция в некоторой игре

Анализ продолжения и реализация хода

Page 29: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Необходимость обеспечить прозрачную схему

взаимодействия с другим объектом

С целью упрощения интерфейса доступа к сервису

С целью сокрытия сложности и ресурсоемкости

реализации

▫ Пример: загрузка изображения, которая требует

времени

Page 30: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Ситуации, когда полезен proxy

Виртуальный заместитель

Большой размер загружаемого объекта

Создание видимости существования объекта,

предоставляющего сервис, когда его еще нет

(объект дорого создавать и может быть он и не

понадобится)

Защищающий заместитель

Имеются ограничения в связи с доступом к объекту

Page 31: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Ситуации, когда полезен proxy

Удаленный заместитель

Создание видимости локального объекта для объекта,

который находится на удаленном компьютере

«Умная» ссылка

Подсчет числа ссылок

Загрузка объекта при первом обращении

Блокировка объекта

Page 32: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Мотивы

▫ Объект, предоставляющий сервис, требует

много времени

▫ Объект, предоставляющий сервис, очень

сложен – proxy создает видимость более

простого объекта

▫ Доступ к объекту, предоставляющему сервис,

требует предварительных действий

▫ От пользователя требуется скрыть, какой

класс сервиса используется

Page 33: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Решение

▫ Для обеспечения прозрачного доступа к объекту

через заместитель, необходимо использовать

общий интерфейс

Page 34: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Решение

▫ Клиенты «не знают», что используют объект-

заместитель вместо реального объекта

Page 35: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Следствия

▫ Способ управления сервисом, обеспечиваемый

proxy-заместителем, прозрачен и для объекта, и для

его клиентов

▫ Если при использовании proxy не возникает новых

исключений, то, как правило, нет необходимости

учитывать наличие proxy в клиентском коде

▫ Доступ к объекту, предоставляющему сервис,

требует предварительных действий

▫ От пользователя требуется скрыть, какой класс

сервиса используется

Page 36: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Пример

▫ Java API

HashMap является proxy для Map

▫ Загрузка изображения

Page 37: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Связь с другими шаблонами▫ Protection Proxy Для проведения политики безопасности при доступе к

сервису▫ Façade Одиночный объект как внешний интерфейс к набору

взаимосвязанных объектов▫ Virtual Proxy Для создания иллюзии существования сервис-объекта

до его действительного создания▫ Decorator Косвенное обращение к сервису с расширением его

возможностей

Page 38: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

(Singleton)

Factory Method

Abstract Factory

Prototype

Builder

Page 39: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Проектирование каркаса приложений для

обработки текста

Интерфейс документа

Абстрактный класс, реализующий логику, общую

для конкретных разновидностей документов

Конкретные классы, реализующие интерфейс

для документов специального типа

Page 40: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Пример общей

логики

getTitle

▫ Примеры логики,

зависящей от типа

документа

newDocument

openDocument

Page 41: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Контекст

▫ Пример общей

логики

getTitle

▫ Примеры логики,

зависящей от типа

документа

newDocument

openDocument

Page 42: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Суть решения

▫ Паттерн, порождающий классы

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

но оставляет подклассам решение о том, какой

объект создавать

• Идентификация

▫ Другое известное имя

Virtual Constructor

Page 45: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Мотивы▫ Класс должен иметь возможность инициировать

создание объекта, не будучи зависимым от класса создаваемого объекта

▫ По мере развития проекта, могут появляться новые классы, объекты которых нужно создавать. Инициирующий создание объектов класс не должен от этого зависеть

▫ Проектирование каркасов приложений

▫ Поскольку фабричный метод, по сути, обеспечивает делегирование процесса создания объекта, то код усложняется (еще больше, чем при простом делегировании)

Page 46: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

• Пример

▫ Модификация программы MultiEditor из курса по

Java GUI

Page 47: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

фабрика)• Контекст

▫ Переключаемые стили интерфейса в

приложении, ориентированном на

мультиплатформенное использование

Page 50: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

фабрика)• Суть решения

▫ Паттерн, порождающий объекты

• Идентификация

▫ Другие известные имена

Kit, Toolkit

Page 51: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

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

фабрика)• Следствия

▫ Клиентский код изолируется от конкретных классов

▫ Упрощается замена семейств конкретных классов

▫ Добавление классов в набор осуществляется просто

▫ Расширение абстрактной фабрики для изготовления новых видов продуктов – довольно трудоемкая задача

▫ Расширение набора характеристик, реализуемых набором классов, требует большой работы

Page 52: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Abstract Factory

• Примеры

▫ JavaAPI

Java.awt.Toolkit class

▫ Контекст применения

Application Skeleton for Look & Feel Changes

▫ Использование в проекте

GoF Sample with Maze Construction

Page 53: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Builder

• Context

▫ Consider the library catalogue management.

Suppose we have XML-descriptions for each book

in the library (XML-BookCard).

▫ Application parses the XML description and then

constructs it’s presentations

In form of bibliography reference

In form of formatted library card

Page 55: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Builder

• Synopsis

▫ The Builder pattern dissociates the process of

constructing complex objects from their

presentation

Different presentations may be obtained as a result of

the same construction processes

Page 56: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Builder

• Forces▫ A program must to be able to produce multiple

external representations of the same data.

▫ The classes responsible for providing content should be independent of any external data representation and the classes that build them.

▫ The classes responsible for building external data representations are independent of the classes that provide the content. Their instances can work with any content-providing object without knowing anything about the content-providing object.

Page 59: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Builder

• Consequences▫ Content determination and the construction of a

specific data representation are independent of each other.

▫ The data representation of the product can change without any impact on the objects that provide the content.

▫ Finer object construction control by giving the director object step-by-step control over creation of the product object, and not the entire object in one step.

▫ There are some evident limitations. It is not always possible to generalize step-by-step sequence for creation objects of different types

Page 60: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

(Filter)

Adapter

Façade

Decorator

Page 61: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

• Synopsis

▫ The Composite pattern allows to create complex

objects by the recursive compositions of similar

objects in the tree-form

▫ It enables objects to be managed in a consistent

manner, demanding the common interface for all

objects

• Other name

▫ Recursive composition

Page 62: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

• Context▫ Document Processing Page may contains

columns and frames

Column may contain frames and vice versa

Columns and frames may contain images

▫ Complex hierarchy with many object relationships

Page 63: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

• Context▫ You can minimize complexity by building an object

hierarchy on the base of common object interface▫ Then we have only one type of objects

Page 64: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

• Forces

▫ You have a complex object you want to

decompose into a part-whole hierarchy of objects.

▫ You want to minimize the complexity of the part-

whole hierarchy by minimizing the number of

different kinds of child objects that objects in the tree

need to be aware of.

▫ There is no requirement to distinguish between

most of the part-whole relationships.

Page 66: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite

• Solution: explanation▫ ComponentIF is the interface implemented by all the objects in the

hierarchy of objects that make up a composite object▫ Component, Component2,… are classes which instances are used as

leaves in the tree organization▫ AbstractComposite is abstract superclass of all composite objects

that participate in the Composite pattern. AbstractComposite defines and provides default implementations of methods for managing a composite object’s components: The add method adds a component to a composite object The remove method removes a component from a composite object The getChild method returns a reference to a component object of a

composite object▫ ConcreteComponent1, ConcreteComponent2,… are classes

which instances are composite objects that use other instances of AbstractComponent.

Page 67: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Composite• Consequences

▫ You can access a tree-structured composite object and the objects that constitute it through the ComponentIF interface, whether they are simple objects or composite. The structure of the composite does not force other objects to make this distinction.

▫ Client objects of an AbstractComponent can simply treat it as an AbstractComponent, without having to be aware of any subclasses of AbstractComponent.

▫ If a client invokes a method of a ComponentIF object that is sup - posed to perform an operation and the ComponentIF object is an AbstractComposite object, then it may delegate the operation to the ComponentIF objects that constitute it. Similarly, if a client object calls a method of a ComponentIF object that is not an AbstractComposite and the method requires some contextual information, then the ComponentIF object delegates the request for contextual information to its parent.

▫ The Composite pattern allows any ComponentIF object to be a child of an AbstractComposite. If you need to enforce a more restrictive relationship, then you will have to add type-aware code to AbstractComposite or its subclasses. That reduces some of the value of the Composite pattern.

Page 68: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Synopsis

▫ An adapter class implements an interface known to

its clients and provides access to an instance of a

class not known to its clients

Page 71: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Forces▫ You want to use a class that calls a method through

an interface, but you want to use it with a class that does not implement the interface. Modifying the class to implement the interface is not an option either because: You do not have the source code for the class;

The class is a general-purpose class and it would be inappropriate for it to implement an interface for a specialized purpose.

▫ You want to dynamically determine which of another object’s methods an object calls without the object having knowledge of the other object’s class

Page 73: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Implementation issues

▫ Two approaches to define how the Adapter

objects will know which instance of the Adaptee

class to call

Pass a reference to the Adaptee object as a

parameter to the adapter object’s constructor or one

of its methods

Make the adapter class an inner class of the Adaptee class

Action listeners control in Java

Page 74: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Implementation example (Java API)

▫ ActionListener: creating anonymous inner class

▫ Calling some external method OnOpen

JMenuItem openFile = new JMenuItem("Open");

openFile.addActionListener(

new ActionListener() {

public void actionPerformed( ActionEvent evt ) {

onOpen();

}

} );

Page 75: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Consequences

▫ The client and adaptee classes remain

independent of each other.

▫ You can use an adapter class to define which of

an object’s methods another object calls (see

example)

▫ The Adapter pattern adds indirection to a

program. Like any other indirection, it contributes to

the difficulty involved in understanding the program.

Page 76: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Adapter

• Related Patterns▫ Iterator Special form of the Adapter pattern for collection iteration.

▫ Façade The Adapter class provides an object that acts as an

intermediary for method calls between a client object and one other object not known to the client. The Façade pattern provide intermediate mechanism for multipleobjects control.

▫ Proxy Also uses surrogating object but, unlike the Adapter, a

proxy object has the same interface as the object which it is a surrogate.

Page 77: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Façade

• Synopsis

▫ Simplify using the set of objects or subsystems

providing one object that other objects outside this

set use to communicate with the set

Page 78: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Decorator

• Synopsis

▫ Provides transparent way to add or remove

functionality of some component implementing the

same interface as original object

• Other name

▫ Wrapper

Page 79: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

Command

(Iterator)

(Observer)

State

Null Object

Strategy

(Visitor)

Page 80: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

• Synopsis

▫ Object sends a command without knowing what

object or objects will receive it. The command are

being passed to a chain of objects that is typically

part of a larger structure. Each object in the chain

may handle the command, pass the command on

to the next object in the chain, or do both

Page 81: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

• Context

▫ You are writing software to monitor a security

system consisting of sensing devices that transmit

status information to a computer. The computer’s

job is to log all status information, maintain a

display showing current status information, and

transmit alarms in the event of security violation.

Page 82: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

:Building

:Floor

:Room

:Sensor

:Room

:Sensor

:Floor

:Room

:Sensor

:Room

:Sensor

:Room

:Sensor

:Warehouse :Hall

:Entrance

:Sensor

Page 83: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

• Forces▫ You want an object to be able to send a command to

another object without specifying the receiver. Then sending objects have no deal to care which object handles the command

▫ More than one object may be able to receive and handle a command, so you need a way to prioritize among the receivers without the sending object knowing anything about them

▫ The objects you may want to potentially handle commands are organized into a structure that can serve to prioritize among the potential handlers of a command

Page 85: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

• Implementation example

▫ Implementing the context sample in Java

Page 86: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Chain of Responsibility

• Consequences▫ Reducing coupling between the object that sends a

command and the object that handles the command▫ Flexibility in deciding how to handle commands. Decisions

about which object will handle a command can be varied by changing which objects are in the chain of responsibility or changing the order of the objects in the chain of responsibility

▫ There is no guarantee that every command will be handled▫ If the number of objects in a chain becomes large, there

can be efficiency concerns about the amount of time that it takes a command to propagate through the chain. A high percentage of commands that are not handled makes the problem even harder because commands that are not handled are propagated through the full length of the chain

Page 87: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Command

• Synopsis

▫ Encapsulate commands in objects so that you can

control their selection and sequencing, queue

them, undo them, and otherwise manipulate them

• Context

▫ Text processing

Undo and Redo

actions

Controlling

commands

Page 88: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Command

• Forces

▫ You need to control the sequencing, selection, or

timing of command execution

▫ You need to manage the undo and redo of

commands

▫ You need to create and maintain the command

history that can be incorporated into the transaction

mechanisms allowing to return to the previously

done commands, to log and to abort them

Page 90: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Command

• Consequences▫ The object that invokes a command is not the same object

that executes a command. This separation provides flexibility in the timing and sequencing of commands. Materializing commands as objects means that they can be collected, delegated to, and otherwise manipulated like any other kind of object

▫ Being able to collect and control the sequencing of commands means that you can use the Command pattern as the basis of a mechanism that supports keyboard macros. This is a mechanism that records a sequence of commands and allows them to be replayed later. The Command pattern can also be used to create other kinds of composite patterns

▫ Adding new commands is usually easy because it does not break any dependencies

Page 92: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

(Single Threaded Execution)

Lock Object

(Read/Write Lock)

(Producer-Consumer)

(Double Buffering)

Future

Page 93: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

LockObject

• Synopsis

▫ An operation that requires single-threaded access

to multiple objects is to be performed. Save time

and complexity by having an additional object that

gets locked instead of the multiple objects that

participate directly in the operation

Page 94: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Lock Object

• Context

▫ Writing a game

Access / change field properties

Access / change multiple game objects status and

properties

Making implementation more simple without a lot of

iterations and recursions

Avoiding deadlock situation

Page 95: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Lock Object

• Solution

▫ Subclasses of the

abstract class call

the static getLockObject

method to get the

lock object to

synchronize

operations.

Page 96: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Lock Object

• Implementation examplepublic abstract class AbstractGameObject {

private static final Object lockObject = new Object();

private boolean active;

public static final Object getLockObject() { return lockObject; }

public boolean isActive() { return active; }

public void setActive(boolean newValue) { active = newValue; }

}

class Hero extends AbstractGameObject {

private ArrayList weapons = new ArrayList();

public void dropAllWeapons() {

synchronized (getLockObject()) {

for( Weapon w: weapons ) {

w.setActive(true);

} // for ...

} // synchronized

} // dropAllWeapons()

}

Page 97: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Future

• Synopsis

▫ Use an object to encapsulate the result of a

computation in a way that hides from its clients

whether the computation is synchronous or

asynchronous

• Other name

▫ Promise

Page 98: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Future

• Context

▫ Weather

information

for some

location

obtained

and

displayed

by client

application

Page 99: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Future

• Forces▫ A computation takes place asynchronously of other

threads that use the result of the computation.▫ An asynchronous computation can notify objects that

use its result that the result is available by using the Observer pattern or passing the object an event of some sort. For this to work properly, it may be necessary to have single-threaded access to some methods or sections of code. In some situations, this may add an unacceptable level of overhead or complexity to a class.

▫ You want to encapsulate a computation so that its clients do not need to know whether it is synchronous or asynchronous.

Page 101: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Future

• Consequences

▫ The classes that use a computation are relieved

of any responsibility for concurrency.

▫ If the computation is asynchronous, all of the

complexity related to synchronization is in the Future

class.

Page 102: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Future

• Example▫ JavaAPI Java.awt.MediaTracker class.

Class encapsulates the process of asynchronously loading image data into the ImageProducer object associated with an Image object. It fills both the Requester and the Future roles.

The MediaTracker class does not encapsulate the result of loading the image data. It just encapsulates the process of loading the data. The ImageProducerobject fills the Result role.

Page 103: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Основные тезисы к окончанию курса

Page 104: Software Engineering Ikspt.icc.spbstu.ru/media/files/people/pyshkin/courses/...Java API String –манипулирование строками сильно упрощается,

Software Engineering IОбъектно-ориентированный

анализ и проектирование

Раздел 5. Паттерны

проектирования: разновидности

и примеры

Q & A