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();
	}
}