Composite

Situace

Do systému je třeba zabudovat hierarchickou strukturu, která se skládá ze dvou typů objektu: primitivní (leaf) a složené (composite), které obsahují další vnořené objekty. Oba typy objektů mají společné rozhraní, ale každý z nich implementuje požadované funkce jinak. Oba typy jsou tedy vzájemně zaměnitelné.

Příklady: Adresáře, ve kterých mohou být soubory i další adresáře. Výrobky, které se mohou skládat z materiálu i z dalších výrobků (polotovarů). Menu, jehož položky mohou být příkazy i další menu.

Řešení

Každý typ objektu bude reprezentován jednou třídou. Jedna třída (Leaf) bude představovat primitivní objekt, druhá třída (Composite) bude představovat objekt složený. Obě třídy budou implementovat společné rozhraní (Component). Třída reprezentující složený objekt bude obsahovat kód, který využije vnořených objektů při realizaci společné funkcionality. Může jimi například procházet či požadavek přeposlat na každý z nich.

diagram tříd

Implementace

Společné rozhraní

kód v jazyce Java - Zobrazit

  1. /**
  2.  * Společné rozhraní komponent.
  3.  * @author Vojtěch Hordějčuk
  4.  */
  5. public interface Component {
  6.   /**
  7.    * Příklad operace.
  8.    */
  9.   public void doSomething();
  10. }
Objekty

kód v jazyce Java - Zobrazit

  1. /**
  2.  * Primitivní objekt.
  3.  * @author Vojtěch Hordějčuk
  4.  */
  5. public class Leaf implements Component {
  6.   @Override
  7.   public void doSomething() {
  8.     // TODO: operace primitivního objektu
  9.   }
  10. }

kód v jazyce Java - Zobrazit

  1. /**
  2.  * Složený objekt.
  3.  * @author Vojtěch Hordějču
  4.  */
  5. public class Composite implements Component {
  6.   /**
  7.    * vnořené objekty
  8.    */
  9.   private Collection<Component> components;
  10.  
  11.   // TODO: zde může být kód pro správu vnořených objektů
  12.   // add(Component c)
  13.   // remove(Component c)
  14.  
  15.   @Override
  16.   public void doSomething() {
  17.     // projít vnořené objekty a něco udělat
  18.  
  19.     for (Component component : this.components) {
  20.       component.doSomething();
  21.     }
  22.   }
  23. }

Reference