no tenés bien definida una interfaz
tus decoradores están aceptando objetos de cualquier tipo
Debe ser algo como:
tu clase Html va a definir la interfaz de los componentes a los que se pueden añadir funcionalidades
tu clase Tag (interfaz para los decoradores concretos) extiende a Html (Componentes) y tus decoradores concretos (Strong, Italic, etc) extienden a Tag por lo que son también componentes
Si te fijás en el diagrama uml del patrón (o sea la base), hay una realación de agregación, un decorador agrega componentes
en el constructor de tu clase Link no debes preguntar por el tipo de datos, ya que podés especificar qué tipo de datos debe aceptar el que es pasado por parámetro
Código PHP:
Ver originalpublic function __construct(Html $decorador) {
$this->_html = "<a href=''>". $decorador ."</a>";
}
en vez de
fijate el diagrama uml
http://es.wikipedia.org/wiki/Decorat...dise%C3%B1o%29
acá explica los participantes
http://dmi.uib.es/people/yuhua/TAP04-05/3.6.pdf
¿otra es que Tu clase Img que funcionalidad daría? creo que ese objeto debe recibir funcionalidad, como ser la de un enlace.
Aclaro que recién estoy tratando de comprender los patrones, hay cosas que por ahi no tengo en cuenta pero a partir de esto muchos pueden dar aportes/correcciones que nos ayuden a aprender jeje
Asi que aprovecho para tirar mi ejemplo y que salgan correcciones
Código PHP:
Ver original<?php
abstract class Html
{
protected $_html;
public function render(){
return $this->_html;
}
}
class Texto extends Html
{
public function __construct($texto)
{
$this->_html = $texto;
}
}
abstract class Decoradores extends Html
{
public function __construct(Html $decorador)
{
$this->_html = $decorador->render();
}
}
class Link extends Decoradores
{
public function render()
{
return $this->_html = "<a href=''>". $this->_html ."</a>";
}
}
Class Italica extends Decoradores
{
public function render()
{
return $this->_html = "<i>". $this->_html ."</i>";
}
}
$t = new Texto("Mi texto");
echo $t->render() . "<br /><br />";
$i = new Italica(new Texto("Texto itálica"));
echo $i->render() . "<br /><br />";
$link = new Link(new Italica
(new Texto
("Un link itálica"))); echo $link->render();
La clase texto es un componente al que se pueden dar funcionalidades pero el no puede añadir funcionalidad a otro, no es un decorador.
este es el uml y está la clase Img que lo colocaría como componente