Composite

Das Composite-Muster ist wahrscheinlich eines der ästhetisch schönsten Muster, da es zwischen der statischen Vererbungsstruktur seiner Komponenten und ihren dynamischen Komponenten Beziehungen erzeugt. Wie man es schon aufgrund des Namens erwartet, gibt das Composite-Muster das Beispiel für das Prinzip: Zusammensetzung gegenüber Vererbung bevorzugen. Klassisch für das Composite-Muster ist das Erzeugen von Kindknoten, wie man schön auf dieser Seite sehen kann.

interface HtmlElement {
	
    public function __toString();
}

class H1 implements HtmlElement {
    private $_text;

    public function __construct($text) {
        $this->_text = $text;
    }

    public function __toString() {
        return "<h1>".$this->_text."</h1>";
    }
}

class P implements HtmlElement {
    private $_text;

    public function __construct($text) {
        $this->_text = $text;
    }

    public function __toString() {
        return "<p>".$this->_text."</p>";
    }
}

class Div implements HtmlElement {
    private $_children = array();

    public function addChild(HtmlElement $element) {
        $this->_children[] = $element;
    }

    public function __toString() {
    	
        $html = "<div>\n";
        
        foreach ($this->_children as $child) {
            $html .= "\t" . str_replace("\n", "\n\t", $child)."\n";
        }
        
        $html .= "</div>";
        return $html;
    }
}

$div = new Div();
$div->addChild(new H1('Titel'));
$div->addChild(new P('Ich bin ein Text in einem Absatz'));

$sub = new Div();
$sub->addChild(new P('Ich bin ein anderer Text - aber innerhalb eines Subdivs'));
$div->addChild($sub);
echo $div, "\n";
// <div>
//	<h1>Titel</h1>
//	<p>Ich bin ein Text in einem Absatz</p>
//	<div>
//		<p>Ich bin ein anderer Text - aber innerhalb eines Subdivs</p>
//	</div>
// </div>

Das Zend Development Enviroment (ZDE) gibt zur Laufzeit wunderbar folgende Variablen aus. Gut zu erkennen ist die baumartiige Struktur der Objekte und Eigenschaften.

$div	Object of: Div	
	Div::_children	Array [3]	
		0	Object of: H1	
			H1::_text	(string:5) Titel	
		1	Object of: P	
			P::_text	(string:32) Ich bin ein Text in einem Absatz	
		2	Object of: Div	
$sub	Object of: Div	
	Div::_children	Array [1]	
		0	Object of: P	
			P::_text	(string:55) Ich bin ein anderer Text - aber innerhalb eines Subdivs	

Kommentare