Wzorzec projektowy Composite jest strukturalnym wzorcem projektowym wykorzystywanym przy tworzeniu hierarchiczne struktury (drzewiastej) złożonej z obietków. Pozwala traktować jednakowo obiekty jak i grupy obiektów.
Aplikacji dostarczają możliwość grupowania obiektów, jednak wykonanie operacji na pojedyńczych obiektach i ich kontenerach są różne.
Kompozyt definiuje interfejs, który jest wspólny zarówno dla pojedyńczych jednostek jak i ich grup. W interfejsie tym są zdefiniowane wszystkie metody charakterysytyczne dla obu tych obiektów przez co są traktowane tak samo przez klienta. Jednak implementacja tych metod jest różna w pojedyńczych obiektach i inna w grupach.
Wzorzec kompozyt wykorzystuje się najczęściej w sytuacji gdy chcemy reprezentować całą hierarchię obietków 9lub tylko część hierarchii), lub gdy chcemy aby klient nie widział różnicy między pojedyńczym obiektem a ich kolekcją. Klient będzie traktował wszystkie obiekty jednakowo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
public interface JednostkaOrganizacyjna { public void dodajJednostke(JednostkaOrganizacyjna jo); public void usunJednostke(JednostkaOrganizacyjna jo); public int wyliczPensje(); public String getName(); } public class Biuro implements JednostkaOrganizacyjna { private List<JednostkaOrganizacyjna> pracownicy = new ArrayList<JednostkaOrganizacyjna>(); private String name; public void dodajJednostke(JednostkaOrganizacyjna jo) { pracownicy.add(jo); } public Biuro(String name) { this.name = name; } public void usunJednostke(JednostkaOrganizacyjna jo) { pracownicy.remove(jo); } public int wyliczPensje() { int razem = 0; System.out.println(name + ":"); for (JednostkaOrganizacyjna pracownik : pracownicy) { razem += pracownik.wyliczPensje(); } System.out.println("Razem pensja w biurze: " + name + " " + razem); return razem; } public String getName() { return name; } } public class Pracownik implements JednostkaOrganizacyjna{ private String name; private int pensja; public Pracownik(String name, int pensja) { this.name = name; this.pensja = pensja; } public void dodajJednostke(JednostkaOrganizacyjna jo) { System.out.println("Nie mogę dodać nic do osoby"); } public void usunJednostke(JednostkaOrganizacyjna jo) { System.out.println("Skoro nie mogę dodać to i nie mogę odjąć"); } public int wyliczPensje() { System.out.println(name+ " "+ pensja); return pensja; } public String getName() { return name; } } public class Klient { public static void main(String[] args) { JednostkaOrganizacyjna spolka = new Biuro("Spółka ABC"); JednostkaOrganizacyjna szef = new Pracownik("Jak Kowalski", 15000); JednostkaOrganizacyjna ksiegowosc = new Biuro("Księgowość"); JednostkaOrganizacyjna ewa = new Pracownik("Ewa Nowak", 6000); JednostkaOrganizacyjna adam = new Pracownik("Adam Nowak", 6000); spolka.dodajJednostke(szef); spolka.daodajJednostke(ksiegowosc); ksiegowosc.dodajJednostke(ewa); ksiegowosc.dodajJednostke(adam); spolka.wyliczPensje(); } } |
Diagram wzorca: