Структурные

Отвечают за построение удобных в поддержке иерархий классов.

Адаптер

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

Note

Адаптер предоставляет классу альтернативный интерфейс. Декоратор предоставляет расширенный интерфейс. Заместитель предоставляет тот же интерфейс.

Адаптер оборачивает только один класс, а Фасад оборачивает целую подсистему.

Аналогия

../../_images/21_.png
../../_images/21.png

Мост

Разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга. абстракция (или интерфейс) — это образный слой управления чем-либо. Он не делает работу самостоятельно, а делегирует её слою реализации (иногда называемому платформой).

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

Паттерн Мост предлагает заменить наследование агрегацией или композицией. Для этого нужно выделить одну из таких «плоскостей» в отдельную иерархию и ссылаться на объект этой иерархии, вместо хранения его состояния и поведения внутри одного класса. Т.е. в иерархии цветов хранить инстанс формы

Если говорить о реальных программах, то абстракцией может выступать графический интерфейс программы (GUI), а реализацией — низкоуровневый код операционной системы (API), к которому графический интерфейс обращается по реакции на действия пользователя (МОСТ).

Note

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

Мост, Стратегия и Состояние (а также слегка и Адаптер) имеют схожие структуры классов — все они построены на принципе «композиции», то есть делегирования работы другим объектам

Аналогия

../../_images/22_.png


../../_images/22.png

Компоновщик

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

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

Считай список (Leaf, Branch(Список)) и свертка его (сложение всех элементов)

Аналогия

../../_images/23_.png
../../_images/23.png

Декоратор

Позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».

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

Аналогия

../../_images/24_.png
../../_images/24.png

Фасад

Предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.

Фасад — это простой интерфейс для работы со сложной подсистемой, содержащей множество классов. Фасад может иметь урезанный интерфейс, не имеющий 100% функциональности, которой можно достичь, используя сложную подсистему напрямую. Но он предоставляет именно те фичи, которые нужны клиенту, и скрывает все остальные.

Аналогия

../../_images/25_.png
../../_images/25.png

Легковес

Позволяет вместить бóльшее количество объектов в отведённую оперативную память. Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в каждом объекте.

Контекст одинаковых объектов Частиц, с разным положением в пространстве (напр. в игре):

Если внимательно посмотреть на класс частиц, то можно заметить, что цвет и спрайт занимают больше всего памяти. Более того, они хранятся в каждом объекте, хотя фактически их значения одинаковы для большинства частиц. Остальное состояние объектов — координаты, вектор движения и скорость — отличаются для всех частиц. А цвет и спрайт — это данные, не изменяющиеся во времени.

Аналогия

../../_images/26_.png
../../_images/26.png

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

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

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

Аналогия

../../_images/27_.png
../../_images/27.png