Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кочелаев_сессия.docx
Скачиваний:
3
Добавлен:
08.08.2019
Размер:
128.03 Кб
Скачать
  1. Структурные паттерны

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

Адаптер

Adapter / Wrapper

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

Да

Мост

Bridge

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

Да

Компоновщик

Composite

Объект, который объединяет в себе объекты, подобные ему самому

Да

Декоратор или Wrapper/Обёртка

Decorator

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

Да

Фасад

Facade

Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое

Да

Единая точка входа

Front Controller

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

Нет

Приспособленец

Flyweight

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

Да

Заместитель

Proxy

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

Да

  1. Адаптер и декоратор

АдаптерAdapter или Wrapper/Обёртка — структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.

Назначение: для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс (приводит интерфейс класса (или нескольких классов) к интерфейсу требуемого вида)

Применяется в случаях: система поддерживает требуемые данные и поведение, но имеет неподходящий интерфейс. Чаще всего шаблон Адаптер применяется если необходимо создать класс, производный от вновь определяемого или уже существующего абстрактного класса.

Плюсы: инкапсуляция реализации внешних классов (компонентов, библиотек), система становится независимой от интерфейса внешних классов; переход на использование других внешних классов не требует переделки самой системы, достаточно реализовать один класс Adapter.

ДекораторDecorator — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения кобъекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности.

Известен также под менее распространённым названиемОбёртка (Wrapper), которое во многом раскрывает суть реализации шаблона.

Задача

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

Способ решения

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

Участники

Класс ConcreteComponent — класс, в который с помощью шаблона Декоратор добавляется новая функциональность. В некоторых случаях базовая функциональность предоставляется классами, производными от классаConcreteComponent. В подобных случаях класс ConcreteComponentявляется уже не конкретным, а абстрактным. Абстрактный класс Componentопределяет интерфейс для использования всех этих классов.

Следствия

1. Добавляемая функциональность реализуется в небольших объектах. Преимущество состоит в возможности динамически добавлять эту функциональность до или после основной функциональности объектаConcreteComponent. 2. Позволяет избегать перегрузки функциональными классами на верхних уровнях иерархии 3. Декоратор и его компоненты не являются идентичными

Реализация

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

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

Замечания и комментарии

  • Хотя объект-декоратор может добавлять свою функциональность до или после функциональности основного объекта, цепочка создаваемых объектов всегда должна заканчиваться объектом класса ConcreteComponent.

  • Базовые классы языка Java широко используют шаблон Декоратор для организации обработки операций ввода-вывода.

  • И декоратор, и адаптер являются обертками вокруг объекта — хранят в себе ссылку на оборачиваемый объект и часто передают в него вызовы методов. Отличие декоратора от адаптера в том, что адаптер имеет внешний интерфейс, отличный от интерфейса оборачиваемого объекта, и используется именно для стыковки разных интерфейсов. Декоратор же имеет точно такой же интерфейс, и используется для добавления функциональности.

  • Для расширения функциональности класса возможно использовать как декораторы, так и стратегии. Декораторы оборачивают объект снаружи, стратегии же вставляются в него внутрь по неким интерфейсам. Недостаток стратегии: класс должен быть спроектирован с возможностью вставления стратегий, декоратор же не требует такой поддержки. Недостаток декоратора: он оборачивает ровно тот же интерфейс, что предназначен для внешнего мира, что вызывает смешение публичного интерфейса и интерфейса кастомизации, которое не всегда желательно.