Структурные паттерны
Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. |
|||
Адаптер |
Adapter / Wrapper |
Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс |
Да |
Мост |
Bridge |
Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо |
Да |
Компоновщик |
Composite |
Объект, который объединяет в себе объекты, подобные ему самому |
Да |
Декоратор или Wrapper/Обёртка |
Decorator |
Класс, расширяющий функциональность другого класса без использования наследования |
Да |
Фасад |
Facade |
Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое |
Да |
Единая точка входа |
Front Controller |
Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы |
Нет |
Приспособленец |
Flyweight |
Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым |
Да |
Заместитель |
Proxy |
Объект, который является посредником между двумя другими объектами, и который реализовывает/ограничивает доступ к объекту, к которому обращаются через него |
Да |
Адаптер и декоратор
Адаптер, Adapter или Wrapper/Обёртка — структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.
Назначение: для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс (приводит интерфейс класса (или нескольких классов) к интерфейсу требуемого вида)
Применяется в случаях: система поддерживает требуемые данные и поведение, но имеет неподходящий интерфейс. Чаще всего шаблон Адаптер применяется если необходимо создать класс, производный от вновь определяемого или уже существующего абстрактного класса.
Плюсы: инкапсуляция реализации внешних классов (компонентов, библиотек), система становится независимой от интерфейса внешних классов; переход на использование других внешних классов не требует переделки самой системы, достаточно реализовать один класс Adapter.
Декоратор, Decorator — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения кобъекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности.
Известен также под менее распространённым названиемОбёртка (Wrapper), которое во многом раскрывает суть реализации шаблона.
Задача
Объект, который предполагается использовать, выполняет основные функции. Однако может потребоваться добавить к нему некоторую дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта.
Способ решения
Декоратор предусматривает расширение функциональности объекта без определения подклассов.
Участники
Класс ConcreteComponent — класс, в который с помощью шаблона Декоратор добавляется новая функциональность. В некоторых случаях базовая функциональность предоставляется классами, производными от классаConcreteComponent. В подобных случаях класс ConcreteComponentявляется уже не конкретным, а абстрактным. Абстрактный класс Componentопределяет интерфейс для использования всех этих классов.
Следствия
1. Добавляемая функциональность реализуется в небольших объектах. Преимущество состоит в возможности динамически добавлять эту функциональность до или после основной функциональности объектаConcreteComponent. 2. Позволяет избегать перегрузки функциональными классами на верхних уровнях иерархии 3. Декоратор и его компоненты не являются идентичными
Реализация
Создается абстрактный класс, представляющий как исходный класс, так и новые, добавляемые в класс функции. В классах-декораторах новые функции вызываются в требуемой последовательности — до или после вызова последующего объекта.
При желании остаётся возможность использовать исходный класс (без расширения функциональности), если на его объект сохранилась ссылка.
Замечания и комментарии
Хотя объект-декоратор может добавлять свою функциональность до или после функциональности основного объекта, цепочка создаваемых объектов всегда должна заканчиваться объектом класса ConcreteComponent.
Базовые классы языка Java широко используют шаблон Декоратор для организации обработки операций ввода-вывода.
И декоратор, и адаптер являются обертками вокруг объекта — хранят в себе ссылку на оборачиваемый объект и часто передают в него вызовы методов. Отличие декоратора от адаптера в том, что адаптер имеет внешний интерфейс, отличный от интерфейса оборачиваемого объекта, и используется именно для стыковки разных интерфейсов. Декоратор же имеет точно такой же интерфейс, и используется для добавления функциональности.
Для расширения функциональности класса возможно использовать как декораторы, так и стратегии. Декораторы оборачивают объект снаружи, стратегии же вставляются в него внутрь по неким интерфейсам. Недостаток стратегии: класс должен быть спроектирован с возможностью вставления стратегий, декоратор же не требует такой поддержки. Недостаток декоратора: он оборачивает ровно тот же интерфейс, что предназначен для внешнего мира, что вызывает смешение публичного интерфейса и интерфейса кастомизации, которое не всегда желательно.