Kompozit
Návrhový vzor kompozit řeší hierarchii objektů tak že je skládá do stromové struktury. Hlavní pointou pak je, aby se s jedním objektem manipulovalo stejně jako s celým kompozitem (skupinou objektů). Realizace je taková, že rozhraní definující chování jednotlivých objektů implementuje i třída reprezentující skupiny objektů.
Na obrázku vidíte příklad kdy třída Platno obsahuje všechny objekty typu Grafic které se umí vykeslit. Sama implmentuje taky rozhranní Grafic, takže kromě přímek a mnohouhelníků obsahovat i další podplátna.
![]() |
![]() |
Příklad implementace v Javě. 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); } }