Hi,
ich möchte eine Klasse mehrfach um Funktionalität erweitern, konkret den ViewHelper HeadLink von Zend.
Für alle die das ZF nicht kennen: HeadLink repräsentiert eine Sammlung von <link />-Tags des Headers.
Meine Funktionalitäten sollen sein:
Merge
Minify
Cache
Merge soll mehrere <link />-Tags zu einem zusammenfassen.
Minify soll die Datei eben klein machen, also Whitespaces entfernen.
Cache soll das Ergebnis von allem cachen.
Wie nennt sich denn das Entwurfmuster um HeadLink um Funktionalität zu erweitern? Decorator, ist es ein Proxy, keines von beidem?
Den Code stelle ich mir in etwa so vor:
(statt new vermutlich eher $this->view->headDecorator($headLink), aber ist nur zur Veranschaulichung).
Als Schnittstelle schwebt mir so etwas vor:
So könnte das Caching auch wirklich greifen, nämlich in dem Merge und Minify nur eine Quersumme aus Dateinamen und Änderungsdatum für getModificationId() zurückliefern.
Vorgehensweise gut?
Wie heißt das Pattern?
Zumindest bei Zend_Form_Decorator wird es ja ähnlich gemacht, wenn auch iterativ statt verschachtelt.
ich möchte eine Klasse mehrfach um Funktionalität erweitern, konkret den ViewHelper HeadLink von Zend.
Für alle die das ZF nicht kennen: HeadLink repräsentiert eine Sammlung von <link />-Tags des Headers.
Meine Funktionalitäten sollen sein:
Merge
Minify
Cache
Merge soll mehrere <link />-Tags zu einem zusammenfassen.
Minify soll die Datei eben klein machen, also Whitespaces entfernen.
Cache soll das Ergebnis von allem cachen.
Wie nennt sich denn das Entwurfmuster um HeadLink um Funktionalität zu erweitern? Decorator, ist es ein Proxy, keines von beidem?
Den Code stelle ich mir in etwa so vor:
PHP-Code:
<?php
class Zend_View_Helper_HeadCommon extends Zend_View_Helper_Abstract {
public function toString($indent = 8)
{
$headLink = new Zend_View_Helper_HeadLink_Decorator_Base($this->view->headLink);
if ($this->_mergeCss) {
$headLink = new Zend_View_Helper_HeadLink_Decorator_Merge($headLink);
}
if ($this->_minifyCss) {
$headLink = new Zend_View_Helper_HeadLink_Decorator_Minify($headLink);
}
if ($this->_cacheCss) {
$headLink = new Zend_View_Helper_HeadLink_Decorator_Cache($headLink);
}
return $headLink->toString($indent);
}
}
?>
Als Schnittstelle schwebt mir so etwas vor:
PHP-Code:
<?php
interface Zend_View_Helper_HeadLink_Decorator_Interface
{
public function getHeadLinkModificationId();
public function toString($indent = null);
}
?>
Vorgehensweise gut?
Wie heißt das Pattern?
Zumindest bei Zend_Form_Decorator wird es ja ähnlich gemacht, wenn auch iterativ statt verschachtelt.

Kommentar