Kompozyt (ang. Composite) (wzorzec strukturalny) umożliwia składanie obiektów w strukturę drzewiastą, dzięki czemu ich widoczność oraz reprezentacja może się sprowadzać do jednego obiektu. Klient zamiast wielu obiektów operuje na jednym, a żądana na nim operacja wykonuje się dla każdego jego potomka. Struktura składa się z prymitywnych obiektów - liści (Leaf) oraz rozszerzonych - kompozytów (Composite), które przypominają gałezię drzewa. Użycie wzorca Kompozyt upraszcza kod klienta, usprawnia zarządzanie grupą obiektów oraz ułatwia dodanie nowego rodzaju komponentów.
Ograniczenia
Projektując strukturę drzewiastą należy mieć na uwadzę, że powstała hierarchia klas może być zbyt ogólna. Wykonanie operacji w danym momencie tylko na określonej grupie obiektów spośród całej struktury jest mocno utrudnione.
Użycie
Wzorzec Kompozyt stosowany jest w miejscach, gdzie grupa podobnych obiektów o wspólnym zachowaniu może zostać ujęta w strukturze drzewiastej. Warto pamiętać, że sercem działania wzorca Kompozyt jest wykonywania operacji na zbiorze obiektów, a nie sama ich reprezentacja w postaci struktury drzewa i właśnie w takim kontekście powinien być używany.
Implementacja
Interfejs Component zawiera metody wspólne dla wszystkich elementów w kolekcji. Każdy element należący do struktury drzewiastej musi implementować interfejs Component. Elementy typu Composite mogą zawierać potomków, natomiast obiekty typu Leaf są ostatnimi w hierarchii elementami i nie posiadają potomków.
Poniższy listing przedstawia implementację wzorca Kompozyt dla jednej klasy rodzica Composite oraz jednej klasy dziecka Leaf.
Tworzenie struktury drzewiastej i podejmowanie na niej wspólnych działań może przebiegać następująco.
Przykład
Sklep internetowy wykorzystuje aplikację Storehouse do zarządzania procesem kompletowania zamówienia klienta. W zależności od rodzaju zamówionych towarów Item są one pakowane do specjalnie przeznaczonych opakowań Box (reklamówki, torby, skrzynie itp). Towary z magazynu trafiają do opakowań, a następnie do sektorów w strefie dostarczeń. Gdy zamówienie jest skompletowane zostaje umieszczone w zbiorczym kontenerze i wysłane do klienta. Aplikacja odnotowuje ruch towarów oraz na podstawie zawartości opakowań generuje pełne rozliczenie. Poniższy listing przedstawia implementacje aplikacji z użyciem wzorca Kompozyt.
Pracownicy magazynu otrzymują kompletują otrzymane zamówienie oraz odnotowują stan poszczególnych produktów.
Biblioteki
Przykładem wykorzystania wzorca Kompozyt w Androidzie są widoki - obiekty typu View oraz ViewGroup. Ich reprezentacja w plikach layout przypomina strukturę drzewiastą, a podjęta akcja dla widoku ViewGroup dotyczy wszystkich jego dzieci zarówno typu View jak i ViewGroup.