Composite

Aus php bar
Wechseln zu: Navigation, Suche

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

 /* COMPONENT */
 abstract class Graphic 
 { 
     // Gibt die Grafik aus
     public function draw();
  
 }
  
 /* 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();
Meine Werkzeuge