Wzorzec projektowy kompozyt (ang. Composite)

Podczas rozwoju aplikacji często można spotkać komponenty,które mogą być pojedyńczymy obiektami lub reprezentować heirarchię obiektów. Wzorzec Kompozytu pozwala klientowi operowanie w sposób ogólny na obiektach które mogą (lub nie) reprezentować hierarchię obiektów.

Zalety

  • klient jednolicie wykonuje operacje na obiekcie złożonym i "prymitywnym"
  • łatwo dodawać nowe rodzaje komponentów

Struktura

Uczesnicy

Uczestnicy
  • Komponent
    • deklaruje interfejs składanych obiektów;
    • implementuje, tam gdzie to możliwe, domyślne zachowanie w wypadku interfejsu wspólnego dla wszystkich klas;
    • definiuje interfejs umożliwiający dostęp i zarządzanie komponentami-dziećmi;
    • (czasami) definiuje interfejs umożliwiający dostęp do rodzica komponentu w strukturze rekurencyjnej i implementuje go, o ile jest to potrzebne.
  • Liść
    • reprezentuje obiekty będące liśćmi w składanej strukturze; liść nie ma dzieci;
    • definiuje zachowanie obiektów pierwotnych w strukturze.
  • Kompozyt
    • definiuje zachowanie komponentów mających dzieci;
    • przechowuje komponenty będące dziećmi;
    • implementuje operacje z interfejsu Komponentu związane z dziećmi.
  • Klient
    • manipuluje obiektami występującymi w strukturze, wykorzystując do tego interfejs komponentu.

Współpraca

Klienci używają interfejsu z klasy Komponent w celu komunikowania się z obiektami występującymi w składanej strukturze. Jeśli odbiorca jest Liściem, to żądania są realizowane bezpośrednio. Jeśli natomiast odbiorca jest Kompozytem, to zwykle przekazuje żądania swoim komponentom-dzieciom, być może wykonując przed i/lub po przekazaniu dodatkowe operacje.