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.