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