Decorator (Dekorierer)

Der Decorator ist eine flexible Alternative zur Unterklassenbildung, um eine Klasse um zusätzliche Funktionalitäten zu erweitern. Normalerweise kann man dies ja auch über Vererbung bewerkstelligen. Aber naja, einer der Grundsätze der objektorientierten Programmierung lautet: lose Kopplung. Manchmal will man eine Klasse zur Laufzeit erweitern und in diesem Fall kann man dieses Pattern verwenden.

class String {
    protected $str;
    
    function __construct($str) {
        $this->str 		= $str;
    }
 
    function display() {
        return $this->str;
    }
}
class Decorator {
    protected $objekt;
    protected $string;
    
    function __construct(String $string_objekt) {
    	// Fuege die Methoden und Eigenschaften der Class String
    	// $string_objekt und damit $this->objekt zu
        $this->objekt = $string_objekt;
        $this->string = $this->objekt->display();
    }
    
    function display() {
        return $this->string;
    }
}
class StringChanger extends Decorator {
    private $decorator;
    
    function __construct(Decorator $decorator) {
       	// Fuege die Methoden und Eigenschaften der Class Decorator
    	// $decorator und damit $this->decorator zu
        $this->decorator = $decorator;
        $this->change();
    }
    
    private function change() {
        $this->decorator->string = "Und jetzt in Kleinbuchstaben: ".strtolower($this->decorator->string);
    }
}

$decorator = new Decorator(new String('Das ist ein Decorator-Test'));
echo $decorator->display() . "\n";

$strchanger = new StringChanger($decorator);
echo $decorator->display() . "\n";

// Das ist ein Decorator-Test
// Und jetzt in Kleinbuchstaben: das ist ein decorator-test

Die ZDE (Zend Development Enviroment) zeigt übrigens zur Beendigung des Scripts folgende Objekte und Eigenschaften an:

$decorator	Object of: Decorator	
	*::objekt	Object of: String	
		*::str	(string:26) Das ist ein Decorator-Test	
	*::string	(string:56) Und jetzt in Kleinbuchstaben: das ist ein decorator-test	
$strchanger	Object of: StringChanger	
	StringChanger::decorator	Object of: Decorator	
		*::objekt	Object of: String	
			*::str	(string:26) Das ist ein Decorator-Test	
		*::string	(string:56) Und jetzt in Kleinbuchstaben: das ist ein decorator-test	
	*::objekt	null	
	*::string	null

Kommentare