Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/07/2011, 10:01
Dany_s
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 11 meses
Puntos: 65
Respuesta: Patron decorador

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 original
  1. public function  __construct(Html $decorador) {
  2.         $this->_html = "<a href=''>". $decorador ."</a>";
  3.     }

en vez de
Código PHP:
Ver original
  1. if ($x instanceof tag){

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
  1. <?php
  2. abstract class Html
  3. {
  4.     protected $_html;
  5.    
  6.     public function render(){
  7.         return $this->_html;
  8.     }
  9.    
  10. }
  11.  
  12. class Texto extends Html
  13. {
  14.     public function  __construct($texto)
  15.     {
  16.         $this->_html = $texto;
  17.     }
  18. }
  19.  
  20. abstract class Decoradores extends Html
  21. {
  22.     public function  __construct(Html $decorador)
  23.     {
  24.         $this->_html = $decorador->render();
  25.     }
  26. }
  27.  
  28. class Link extends Decoradores
  29. {
  30.     public function render()
  31.     {
  32.         return $this->_html = "<a href=''>". $this->_html ."</a>";
  33.     }
  34. }
  35.  
  36. Class Italica extends Decoradores
  37. {
  38.     public function  render()
  39.     {
  40.         return $this->_html = "<i>". $this->_html ."</i>";
  41.     }
  42. }
  43.  
  44. $t = new Texto("Mi texto");
  45. echo $t->render() . "<br /><br />";
  46.  
  47. $i = new Italica(new Texto("Texto itálica"));
  48. echo $i->render() . "<br /><br />";
  49.  
  50. $link = new Link(new Italica(new Texto("Un link itálica")));
  51. 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

Última edición por Dany_s; 18/07/2011 a las 10:32