Composite
Aus php bar
Inhaltsverzeichnis |
Motivation
Das Composite Pattern wird verwendet um Objekte in Baumstrukturen anzuordnen. Interessant hierbei ist, dass man eine Methode auf dem "niedrigsten Zweig auführen kann. Die auf dem niedrigsten Zweig aufgerufene Methode durchläuft alle Kindelemente rekursiv bis zu den letzten "Leaves".
Struktur
Man bedient sich hierbei folgender Konstrukte:
* Component: Die abstrakte Grundklasse (manchmal auch nur ein Interface), welche die Methoden an die Composites und die zugehörigen Leaves vererbt * Leaf: Ein abschließender Punkt, welcher alle Methoden des Components implementiert * Composite: Ein Composite-Element, welches als Kindelemente weitere Composite-Objekte sowie Leaf-Elemente aktzeipiert; Es implementiert alle Component-Methoden um diese an die Kindelemente zu deligieren.
Anwendungsbeispiele
- Layouts: z.B. Composite Layout enthält das Composite "Statusbar" welches die Leaves "ExitButton" und "SaveButton" enthält
- Navigationen: z.B. Online-shops: Kategorien sind Composites und die Artikel sind Leaves
Implementierung
Im Folgenden Beispiel wird ein Grafik-Component Implementiert
1 /* COMPONENT */ 2 abstract class Graphic 3 { 4 // Gibt die Grafik aus 5 public function draw(); 6 7 } 8 9 /* COMPOSITE */ 10 class CompositeGraphic extends Graphic 11 { 12 // Kindelemente 13 private $_childGraphics = array(); 14 15 // Ausgabe der Grafik 16 public function draw() 17 { 18 foreach ($this->_childGraphics as $graphic) { 19 $graphic->draw(); 20 } 21 } 22 23 // Fügt eine Grafik zur Sammlung hinzu 24 public function add(Graphic $graphic) 25 { 26 $this->_childGraphics[] = $graphic; 27 } 28 } 29 30 /* LEAF */ 31 class Ellipse extends Graphic 32 { 33 // Ausgabe der Grafik 34 public function draw() 35 { 36 echo("Ellipse"); 37 } 38 39 } 40 41 /* Beispielausführung */ 42 43 // Ellipsen initialisieren 44 $ellipse1 = new Ellipse(); 45 $ellipse2 = new Ellipse(); 46 $ellipse3 = new Ellipse(); 47 $ellipse4 = new Ellipse(); 48 49 // Drei Composite-Grafiken initialisieren 50 $compositeGraphic = new CompositeGraphic(); 51 $compositeGraphic1 = new CompositeGraphic(); 52 $compositeGraphic2 = new CompositeGraphic(); 53 54 // Grafiken zusammenstellen 55 $compositeGraphic1->add($ellipse1); 56 $compositeGraphic1->add($ellipse2); 57 $compositeGraphic1->add($ellipse3); 58 59 $compositeGraphic2->add($ellipse4); 60 61 $compositeGraphic->add($graphic1); 62 $compositeGraphic->add($graphic2); 63 64 // Ausgabe der gesamten Grafik (gibt vier mal "Ellipse" aus) 65 $compositeGraphic->draw();