Composite (Kompozyt) – strukturalny wzorzec projektowy, którego zadaniem jest łączenie obiektów w strukturę tak, że reprezentują hierarchię części-całość, unifikując dostęp do kolekcji jak i pojedynczego obiektu. Umożliwia to klientom jednolite traktowanie pojedynczych obiektów i również ich kompozycji.
Tego wzorca używałem w klasach np. w tym projekcie, gdzie poszczególne efekty mogły być uzyskane tylko przy pomocy jednej klasy jak również złożone z wielu klas.
Wzorzec składa się z:
- Composite (Kompozyt) – grupa obiektów, które składają się z liści , implementuje interfejs Composite
- Leaf (Liść) – pojedynczy obiekt który nie ma potomków, implementuje interfejs Composite
- Komponent – interfejs który określa zachowania dla danego obiektu lub grupy obiektów
- Klient – operuje na danych zawartych we wzorcu
Przykładowa implementacja:
package pl.shad.net.blog; import java.util.ArrayList; // // Definicja interfejsu komponentu // interface ComponentInterface{ void process(); } // // Klasa liscia - definiuje objekty które nie mają dzieci // class Leaf implements ComponentInterface{ @Override public void process(){ System.out.println("Process: " + this); } } // // Klasa kompozytu // class Composite implements ComponentInterface{ private ArrayList< ComponentInterface > children = new ArrayList< ComponentInterface >(); public void addComponent(ComponentInterface child){ System.out.println("Add children: " + child); children.add(child); } @Override public void process(){ if (!children.isEmpty()){ for (ComponentInterface child : children){ if (child instanceof ComponentInterface){ child.process(); } } } } } // // Klasa klienta: // tworzymy podstawowe obiekty, jeden kompozyt będzie zawierał dwa // takie same obiekty liści // testowo wykonujemy takie same operacje na stworzonych obiektach, // widać ze niezależnie od punktu wejścia (liść, kompozyt czy cała struktura), // wszystkie opracje wykonują się bez problemu // public class DesignPatternsComposite{ public static void main(String[] args){ DesignPatternsComposite dpCom = new DesignPatternsComposite(); dpCom.test(); } private void test(){ System.out.println("Add items ..."); Leaf leaf = new Leaf(); Leaf leaf2 = new Leaf(); Leaf leaf3 = new Leaf(); Composite childComposite = new Composite(); Composite childComposite2 = new Composite(); childComposite.addComponent(leaf); childComposite2.addComponent(leaf); childComposite2.addComponent(leaf2); childComposite2.addComponent(leaf3); Composite composite = new Composite(); composite.addComponent(childComposite); composite.addComponent(childComposite2); System.out.println("Execute process on Leaf ..."); leaf.process(); leaf2.process(); System.out.println("Execute process on Children ..."); childComposite.process(); childComposite2.process(); System.out.println("Execute process on Composite ..."); composite.process(); } } |
Możliwość komentowania jest wyłączona.