Kompozyt to strukturalny wzorzec projektowy, którego głównym celem jest umożliwienie traktowania pojedynczych obiektów i grup obiektów w taki sam sposób.
Wzorzec ten sprawdza się szczególnie wtedy, gdy dane mają strukturę drzewa, np. foldery i pliki, elementy interfejsu użytkownika, kategorie produktów albo struktura organizacyjna firmy.
Główny zamysł
Klient nie musi wiedzieć, czy pracuje z pojedynczym elementem, czy z całym zbiorem elementów. Wywołuje tę samą metodę, a obiekt sam decyduje, jak ją obsłużyć.
Przykład:
- plik jest pojedynczym elementem,
- folder może zawierać pliki i inne foldery,
- zarówno plik, jak i folder mogą mieć metodę wyswietl().
Dzięki temu kod klienta może wyglądać jednolicie:
element.wyswietl();
bez sprawdzania, czy element jest plikiem, czy folderem.
Typowe role we wzorcu
- Component — wspólny interfejs lub klasa abstrakcyjna dla wszystkich elementów.
- Leaf — pojedynczy obiekt, który nie zawiera innych elementów.
- Composite — obiekt złożony, który przechowuje inne elementy i deleguje do nich operacje.
- Client — kod korzystający z obiektów przez wspólny interfejs.
Najważniejsza korzyść
Kompozyt upraszcza kod klienta, ponieważ pozwala obsługiwać pojedyncze obiekty i ich kolekcje w spójny sposób. To właśnie odróżnia go od wzorców, które służą np. do zmiany zachowania obiektu lub komunikacji między obiektami.