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.