Wzorce projektowe: Kompozyt(Composite)

Cześć, trafiłem niedawno na ciekawy wzorzec projektowy o nazwie Kompozyt(Composite), który służy do składania obiektów w strukturę drzewa, dzięki temu między innymi klient widzi zamiast wielu obiektów tylko jeden i o to też w kompozycie chodzi, żeby klient mógł traktować wiele obiektów jak jeden, dokładniej o kompozycie dalej w artykule.

 

Cel

  • Utworzenie obiektów w tzw struktury drzewiaste
  • Składanie obiektów w taki sposób, aby klient widział wiele z nich jako jeden obiekt.
  • Kompozycja rekurencyjna

 

Problem

Wzorca kompozyt możesz użyć, wtedy kiedy musisz operować na hierarchii obiektów. Wtedy nie będziesz musiał odwoływać się do każdego z nich a będziesz mógł traktować tą hierarchię jak pojedynczy obiekt.

 

Dyskusja

Odnoszenie się do grupy obiektów jak do jednego obiektu może w niektórych przypadkach bardzo się przydać, ułatwia bardzo operację na całej grupie, ponieważ nie musisz odwoływać się do każdego obiektu po kolei, możesz wykonywać akcję na całej grupie.

 

Struktura

Kompozyt tak jak było mówione we wstępie operuje na wielu obiektach, ale po kolei, poniżej jest diagram UML wzorca kompozyt:

Composite scheme

Z diagramu wynika, że wzorzec kompozyt składa się z następujących części:

  • Component – klasa abstrakcyjna lub interfejs reprezentujący pojedyncze obiekty Leaf.
  • Leaf – typ prosty – nie posiada potomków.
  • Composite – przechowuje obiekty proste (Leaf), implementuje zachowanie elementów które zawiera.

I oczywiście z klienta, który operuje na danych we wzorcu.

 

Przykład

Schemat wzorca kompozyt

Ale najlepiej zobaczyć to na praktycznym przykładzie, kompozyt wygląda mniej więcej tak:

Jak widać na przykładzie klasa Composite posiada listę do której wkładamy obiekty na których chcemy operować, oraz metody, które dodają lub usuwają obiekty z listy i mam też metodę, która zwraca nam zawartość tej listy.

Obiekty wkładamy do listy w kliencie rzecz jasna 🙂

To taki standardowy schemat działania kompozytu, w skrócie mówiąc kompozyt zawiera hierarchię obiektów w której główny obiekt zarządza swoimi podobiektami.

Wynik

 

Przykłady z życia wzięte

Zakład pracy

Zobaczmy teraz w działaniu kompozyt na przykładzie z życia wzięty. Dobrym przykładem może być np hierarchia w jakimś zakładzie pracy, są kierownicy, którzy zarządzają pracownikami.

Zobaczmy jak to będzie wyglądać na poniższym przykładzie:

Można było się spodziewać czegoś takiego, mamy klasę kierownika, która może dodawać pracowników, mamy również metodę, która wyświetla nazwy pracowników, którzy są podwładnymi kierownika, w kliencie wygląda to tak:

Może też być tak, że kierownik może mieć pod sobą innych kierowników, którzy mają jeszcze innych pracowników, w takim wypadku wywołanie w kliencie wyglądałoby by tak:

Wynik

 

Zbiór figur

Zróbmy sobie przykład z figurami, załóżmy, że chcemy narysować pare figur, ale nie chcemy się z nimi obchodzić pojedynczo, tylko chcemy np rysować jakieś figury i zmieniać je np na kolor czerwony jak jeden obiekt. Zacznijmy od klas Component , Composite oraz Leaf.

Widzimy, że struktura wygląda podobnie jak w poprzednim przykładzie. Myślę, że nie trzeba tu nic tłumaczyć. Zobaczmy teraz jak wygląda klient:

W kliencie dodajemy figury i zmieniamy kolor wszystkich dodanych figur do listy metodą draw().

Wynik:

 

Powiązania z innymi wzorcami

  • Kompozyt i dekorator mają podobne schematy, ponieważ oba mają za zadanie zorganizować określoną liczbę obiektów.
  • Pyłek jest często łączony z Kompozytem, aby zaimplementować współdzielone węzły liści.

 

 

Podsumowanie

I to wszystko na temat wzorca Kompozyt🙂

Jak widać kompozyt nie jest taki trudny. Podsumowując, wzorzec kompozyt ułatwia operowanie na hierarchii obiektów, nie tracąc również dostępu do pojedynczych obiektów, które stanowią grupę, daje to wrażenie jakbyśmy operowali na pojedynczym obiekcie, w rzeczywistości operujemy na grupie obiektów.

Mam nadzieję, że dostatecznie dobrze wytłumaczyłem wzorzec kompozyt i że od teraz będziesz go stosować z łatwością w swoich projektach 🙂

Link do githuba ze wszystkimi przykładami:  https://github.com/Slaw145/CompositeTutorial

W następnym artykule, będzie mowa o wzorcu Most(Bridge).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

Be first!

avatar
  Subscribe  
Notify about