Wzorzec projektowy kompozyt - composite

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 5216 razy

Opis wzorca projektowego kompozyt

Wzorzec projektowy kompozyt należy do wzorców strukturalnych. Umożliwia on tworzenie struktur drzewiastych, gdzie podstawową jednostką jest liść ang. Leaf a rozszerzoną kompozyt ang. Composite, przy czym kompozyt można opisać jako swego rodzaju gałąź struktury. Oba te elementy (liść i kompozyt) dziedziczą po wspólnym interfejsie. Sam kompozyt zawiera kontener, który może przechowywać interfejsy, za którymi mogą stać jednostki podstawowe (liście) lub kolejne gałęzie (kompozyty).

Ten wzorzec jest wręcz stworzony do tworzenia np. drzewa dokumentu XML, implementacji algorytmu ONP, tworzenia struktury menu itd. itp. Innymi słowy można go stosować tam, gdzie ma się do czynienia z strukturami drzewiastymi.

Przykładowy diagram UML wzorca projektowego kompozyt

Jak widać na poniższym diagramie UML użytkownik używa interfejsu iComponent, który został otrzymany z utworzenia instancji obiektów klas Leaf i Composite. Co ważne klasa Composite agreguje interfejsy iComponent w polu components umożliwiając tym samym dodawanie nowych gałęzi (Composite) i liści (Leaf) do obiektu tej klasy.

Bardzo ważnym elementem jest tutaj również destruktor wirtualny, który niszczy wszystkie elementy utworzonej struktury programu.

Diagram UML wzorca projektowego kompozyt
Rys. 1
Przykład diagramu UML dla wzorca projektowego kompozyt

Przykładowa implementacja wzorca projektowego kompozyt w C++

Przykład pokazujący jak można stworzyć drzewo menu programu za pomocą tego wzorca.

#include <iostream> #include <string> #include <vector> class iComponent{ public: virtual void command() const = 0; virtual void addElement(iComponent* icmp){}; virtual void writeAllCommands(std::string suffix) = 0; virtual ~iComponent(){}; }; class Leaf : public iComponent{ std::string cmd; public: Leaf(std::string cmd) : cmd(cmd){}; virtual ~Leaf(){ std::cout<<"Delete leaf: "<<cmd<<std::endl; } virtual void command() const { std::cout<<cmd<<std::endl<<std::endl; } virtual void writeAllCommands(std::string suffix){ std::cout<<suffix<<cmd<<std::endl; } }; class Composite : public iComponent{ std::string cmd; std::vector<iComponent*> components; public: Composite(std::string cmd) : cmd(cmd){}; virtual ~Composite(){ std::cout<<"==============================="<<std::endl; std::cout<<"Delete "<<cmd<<std::endl; std::cout<<"==============================="<<std::endl; while(!components.empty()){ delete components.back(); components.pop_back(); } std::cout<<"==============================="<<std::endl; std::cout<<"End of delete "<<cmd<<std::endl; std::cout<<"==============================="<<std::endl; } virtual void command() const { std::cout<<cmd<<std::endl<<std::endl; } virtual void addElement(iComponent* icmp){ if(icmp){ components.push_back(icmp); } } virtual void writeAllCommands(std::string suffix){ std::cout<<suffix<<"==============================="<<std::endl; std::cout<<suffix<<cmd<<std::endl; std::cout<<suffix<<"==============================="<<std::endl; suffix += "t"; for(std::vector<iComponent*>::iterator icomponent = components.begin(); icomponent < components.end(); icomponent++){ (*icomponent)->writeAllCommands(suffix); } } }; int main(){ iComponent* menu = new Composite("Menu"); iComponent* file = new Composite("File"); file->addElement(new Leaf("Open")); file->addElement(new Leaf("Save")); menu->addElement(file); iComponent* edit = new Composite("Edit"); edit->addElement(new Leaf("Copy")); edit->addElement(new Leaf("Paste")); edit->addElement(new Leaf("Duplicate")); menu->addElement(edit); menu->writeAllCommands(""); if(menu){ delete menu; menu = NULL; } std::cin.get(); return 0; }

Wynik działania powyższego programu:

===============================
Menu
===============================
        ===============================
        File
        ===============================
                Open
                Save
        ===============================
        Edit
        ===============================
                Copy
                Paste
                Duplicate
===============================
Delete Menu
===============================
===============================
Delete Edit
===============================
Delete leaf: Duplicate
Delete leaf: Paste
Delete leaf: Copy
===============================
End of delete Edit
===============================
===============================
Delete File
===============================
Delete leaf: Save
Delete leaf: Open
===============================
End of delete File
===============================
===============================
End of delete Menu
===============================
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/composite - strona opisująca wzorzec projektowy kompozyt [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Propozycje książek
tytuł: C++. Projektowanie oprogramowania. Zasady i wzorce projektowe autor: Klaus Iglberger

Tytuł:

C++. Projektowanie oprogramowania. Zasady i wzorce projektowe

Autor:

Klaus Iglberger

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III autor: Carlos Santana Roldán

Tytuł:

React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III

Autor:

Carlos Santana Roldán

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku autor: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:

Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku

Autor:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

tytuł: Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III autor: Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:

Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III

Autor:

Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

tytuł: Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych autor: Bilgin Ibryam,  Roland Huß

Tytuł:

Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych

Autor:

Bilgin Ibryam, Roland Huß

tytuł: Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II autor: Alan Shalloway, James R. Trott

Tytuł:

Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II

Autor:

Alan Shalloway, James R. Trott

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona