Wzorzec złożony to strukturalny wzorzec projektowy, który umożliwia komponowanie obiektów w struktury przypominające drzewo, reprezentujące hierarchie część-całość. W kontekście architektury oprogramowania i wzorców umożliwia programistom tworzenie złożonych obiektów lub struktur danych poprzez łączenie prostszych, samopodobnych, zwykle poprzez ujednolicony interfejs. Ten wzorzec jest szczególnie przydatny, gdy istnieje potrzeba modelowania hierarchii obiektów o różnym poziomie złożoności i zagnieżdżonych relacjach, gdzie kod klienta może jednakowo traktować poszczególne obiekty i obiekty złożone.
Wzorzec ten promuje zasadę „kompozycji nad dziedziczeniem”, sugerując, że lepiej jest budować złożone obiekty, tworząc prostsze w czasie wykonywania, niż polegać na ustalonej hierarchii dziedziczenia. Wzorzec złożony osiąga to poprzez zdefiniowanie abstrakcyjnej klasy lub interfejsu zwanego komponentem, który definiuje wspólne zachowanie zarówno pojedynczych obiektów (liść), jak i obiektów złożonych (kompozyt). Kod klienta, który wchodzi w interakcję z hierarchią obiektów, może następnie skupić się na interfejsie komponentu, nie martwiąc się o to, jak obiekty są zorganizowane w hierarchii.
We wzorcu złożonym abstrakcyjna klasa lub interfejs komponentu zazwyczaj deklaruje metody zarządzania relacjami rodzic-potomek, takie jak dodawanie, usuwanie lub pobieranie komponentów podrzędnych, a także wszelkie operacje, które należy wykonać na komponentach. Klasa Leaf reprezentująca pojedyncze obiekty i klasa Composite reprezentująca obiekty złożone dziedziczą lub implementują interfejs Component. Podczas gdy klasa Leaf zapewnia podstawową funkcjonalność, klasa Composite zwykle przechowuje kolekcję komponentów podrzędnych, deleguje operacje do tych potomków i opcjonalnie implementuje dodatkowe zachowanie specyficzne dla obiektów złożonych.
Ważną zaletą wzorca Composite jest jego zdolność do uproszczenia kodu klienta poprzez równe traktowanie elementów indywidualnych (Leaf) i złożonych (Composite) poprzez ujednolicony interfejs Component. Umożliwia to kodowi klienta przechodzenie i interakcję z hierarchią obiektów bez konieczności sprawdzania typu, instrukcji warunkowych lub innych mechanizmów, które w przeciwnym razie byłyby wymagane do obsługi różnych typów obiektów.
Godnym uwagi przykładem działania wzorca złożonego jest obiektowy model dokumentu (DOM) w tworzeniu stron internetowych. DOM reprezentuje strukturę dokumentu HTML lub XML jako drzewiastą hierarchię obiektów, w której każdy węzeł drzewa może być indywidualnym elementem, atrybutem lub treścią tekstową, albo elementem złożonym zawierającym inne elementy. Dzięki zastosowaniu wzorca złożonego DOM umożliwia programistom tworzenie, modyfikowanie i przeglądanie struktury dokumentu za pomocą spójnego, ujednoliconego interfejsu API, niezależnie od złożoności dokumentu.
Innym przykładem jest system plików w systemie operacyjnym. W tym przykładzie interfejs Component reprezentowałby ogólny wpis systemu plików, przy czym klasa Leaf reprezentuje pojedyncze pliki, a klasa Composite reprezentuje katalogi, które mogą zawierać zarówno pliki, jak i inne katalogi. Kod klienta może następnie wchodzić w interakcję z systemem plików poprzez ujednolicony interfejs wejściowy systemu plików, traktując pliki i katalogi w jednolity sposób oraz upraszczając ogólną złożoność kodu.
Na platformie AppMaster wzorzec Composite można zastosować w różnych scenariuszach, takich jak zarządzanie komponentami interfejsu użytkownika, budowanie złożonych modeli danych w backendzie lub organizowanie procesów biznesowych jako zagnieżdżonych, modułowych zadań. Wykorzystując zasady kompozycji i ujednoliconych interfejsów, programiści mogą tworzyć skalowalne i łatwiejsze w utrzymaniu aplikacje za pomocą AppMaster, bez zaciągania długów technicznych lub poświęcania elastyczności i wydajności.
Podsumowując, wzorzec złożony to potężny wzorzec projektowy, który oferuje liczne korzyści w procesie tworzenia aplikacji, w tym uproszczenie kodu klienta, promowanie kompozycji zamiast dziedziczenia i umożliwienie płynnej reprezentacji złożonych, przypominających drzewo hierarchii obiektów. Rozumiejąc i stosując ten wzorzec we właściwych kontekstach, programiści mogą tworzyć solidne, skalowalne i łatwe w utrzymaniu rozwiązania programowe, takie jak te oferowane przez platformę AppMaster, która kładzie nacisk na kompozycję wizualną, modułowość oraz ujednolicony, wydajny przepływ pracy programistycznej.