🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • UML диаграмма
  • Преимущества
  • Недостатки
  • Связь с другими паттернами

Was this helpful?

  1. Паттерны
  2. Структурные паттерны

Компоновщик

Composite

Назначение

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

Используется в случаях, когда:

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

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

Пример: директория файловой системы состоит из элементов, каждый их которых также может быть директорией.

  • Код клиента работает с примитивными и составными объектами единообразно.

Решаемые задачи

  • композиция объектов

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

  • предоставление единообразного интерфейса

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

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

  • создание рекурсивных операций

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

UML диаграмма

Преимущества

  • упрощение архитектуры клиентского кода

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

  • повышение гибкости и расширяемости системы за счет добавления новых компонентов в иерархию без изменения существующего кода

  • возможность выполнения рекурсивных операций на составных объектах

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

Недостатки

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

  • нетривиальная логика обхода и работы с сущностью как с контейнером, если в компоновщике содержатся другие компоновщики

  • потеря типизации

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

  • появление нелогичных операций

Максимизация интерфейса класса компонент, приводит к тому, что у подклассов появляются нелогичные операции

Связь с другими паттернами

Leaf – лист:

– представляет листовые узлы композиции и не имеет потомков;

– определяет поведение примитивных объектов в композиции;

Composite – составной объект:

– определяет поведение компонентов, у которых есть потомки;

– хранит компоненты-потомки;

– реализует относящиеся к управлению потомками операции в интерфейсе класса Component;

Component – компонент:

– объявляет интерфейс для компонуемых объектов;

– предоставляет подходящую реализацию операций по умолчанию, общую для всех классов;

– объявляет интерфейс для доступа к потомкам и управления ими;

PreviousРеализации на KotlinNextРеализации на С++

Last updated 1 year ago

Was this helpful?

: отношение компонент-родитель используется в паттерне цепочка обязанностей.

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

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

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

: посетитель локализует операции и поведение, которые в противном случае пришлось бы распределять между классами Composite и Leaf

Цепочка обязанностей
Декоратор
Приспособленец
Итератор
Посетитель
UML диаграмма паттерна "Компоновщик"