Návrhový vzor Composite představuje řešení, jak uspořádat jednoduché objekty a z nich složené (kompozitní) objekty. Snahou vzoru je, aby k oběma typům objektů (jednoduchým a složeným) bylo možné přistoupit jednotným způsobem.
V ukázce je stádo ve kterém jsou objekty psů a krav. Oba umí vytvořit nějaký zvuk. Pomocí tohoto návrhového vzoru můžeme udělat velké stádo které obsahuje více malých stád a nechat udělat daný zvuk všech zvířat které jsou ve velkém stádu.
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
Cow cow1 = new Cow();
AnimalGang dogGang = new AnimalGang(); //vytvoření stáda psů
dogGang.add(dog1);
dogGang.add(dog1);
dogGang.add(dog1);
AnimalGang cowGang = new AnimalGang(); //vytvoření stáda krav
cowGang.add(cow1);
cowGang.add(cow1);
AnimalGang allAnimalsGang = new AnimalGang(); //vytvoření stáda všech zvířat
allAnimalsGang.add(dogGang); //přidání stáda psů do celkového stáda zvířat
allAnimalsGang.add(cowGang); //přidání stáda krav do celkového stáda zvířat
allAnimalsGang.makeSound(); //celkové stádo zvířat udělá nějaký zvuk
}
}
/**
Společný interface pro zvířata, která umí udělat nějaký zvuk
*/
interface Animal {
public void makeSound(); //abstraktní metoda makeSound() představuje že zvíře dokáže udělat nějaký zvuk např. pes štěká, kráva bučí, kočka mňouká atd..
}
class Dog implements Animal{
/**
konkrétní implementace abstraktní metody makeSound() u psa
*/
public void makeSound() {
System.out.println("HAF HAF !!");
}
}
class Cow implements Animal{
/**
konkrétní implementace abstraktní metody makeSound() u krávy
*/
public void makeSound() {
System.out.println("Búúúúúúú !!");
}
}
/**
Třída pro komponování objektů typu Animal
*/
class AnimalGang implements Animal {
// ArrayList pro uchování zvířat ve stádu
private ArrayList<Animal> childAnimals = new ArrayList<Animal>();
public void makeSound() {
Iterator<Animal> it = childAnimals.iterator();
while(it.hasNext()){
Animal animal = it.next();
animal.makeSound();
}
}
public void add(Animal _animal){
this.childAnimals.add(_animal);
}
public void remove(Animal _animal){
this.childAnimals.remove(_animal);
}
}