Patrones de diseño DECORATOR Mario Rodríguez Martín
Introducción También conocido como Wrapper. Propósito Estructural. Ámbito Objeto. Motivación A veces se desea adicionar responsabilidades a un objeto, pero no a toda la clase. Las responsabilidades se pueden adicionar por medio de los mecanismos de Herencia, pero este mecanismo no es flexible porque la responsabilidad es adicionada estáticamente. La solución flexible es la de rodear el objeto con otro objeto que es el que adiciona la nueva responsabilidad. Este nuevo objeto es el Decorator. Aplicabilidad El Decorator se debe usar para:     Adicionar responsabilidades a objetos individuales dinámicamente sin afectar otros objetos.  Para agregar responsabilidades que pueden ser retiradas.  Cuando no es práctico adicionar responsabilidades por medio de la herencia.
Participantes y estructura Componente : Interfaz común a todas las clases susceptibles de ser ampliadas con el Decorador.  ComponenteConcreto : Son las clases cuya funcionalidad se puede extender y en las que se delega en última instancia para realizar las operaciones propias de la clase.
Participantes y estructura Decorador : Clase abstracta que declara la estructura común a todos los Decoradores y declara (o implementa, según sea el caso) la responsabilidad de mantener una referencia al objeto que se extiende. Es posible que sobrecargue todos los métodos de la clase Componente con llamadas al componente concreto, de forma que aquellos métodos cuya funcionalidad no se extiende simplemente llaman a los originales.  DecoradorConcreto1  y  DecoradorConcreto2 : Son clases concretas que heredan de Decorador e implementan las extensiones de funcionalidad de la clase original ComponenteConcreto.
Colaboraciones
Problema que soluciona (Ejemplo) Supongamos que tenemos una clase existente  Ventana  y queremos añadirle funcionalidad para que muestre un borde alrededor. Podemos crear una subclase  VentanaConBorde  que herede de  Ventana . Hasta aquí todo bien, pero supongamos que surge la necesidad de crear una ventana que muestre un pequeño botón de ayuda con un signo de interrogación (?) en su parte superior. Entonces tenemos las siguientes opciones: Crear otra subclase de  Ventana :  VentanaConBotónDeAyuda .  Problema:  No cubre la necesidad de tener ventanas con bordes y botón de ayuda a la vez. Crear una subclase de  VentanaConBorde :  VentanaConBordeYBotonDeAyuda .  Problema:  No tenemos una ventana con botón de ayuda y sin borde. Crear clases para todas las combinaciones posibles de funcionalidades.  Problema:  Con este ejemplo tendríamos cuatro clases:  Ventana ,  VentanaConBorde ,  VentanaConBotonDeAyuda  y  VentanaConBordeYBotonDeAyuda ; con tres funcionalidades tendríamos ocho clases y con cuatro, ¡dieciséis!. Para n funcionalidades se necesitan 2 n  clases.
Implementación (Ejemplo) El patrón  Decorator  soluciona este problema de una manera mucho más sencilla y extensible. Se crea a partir de  Ventana  la subclase abstracta  VentanaDecorador  y, heredando de ella,  BordeDecorador  y  BotonDeAyudaDecorador .  VentanaDecorador  encapsula el comportamiento de  Ventana  y utiliza composición recursiva para que sea posible añadir tantas "capas" de Decorators como se desee. Podemos crear tantos Decoradores como queramos heredando de  VentanaDecorador .
Codificación: Ejemplo (I) // Interfaz Ventana   public interface Ventana  {  public void dibujar();  // dibuja la ventana public String getDescripcion();  // devuelve la descripción de la ventana   }  // Implementacion de una ventana concreta public class VentanaConcreta implements Ventana  {  public void dibujar()  {  // dibujamos la ventana   }  public String getDescripcion()  {  return “ventana simple”;  }  }
Codificación: Ejemplo (II) // Clase abstracta VentanaDecorador – implementa a la clase Ventana public abstract class VentanaDecorador implements Ventana  {  protected Ventana decoradorVentana;  public VentanaDecorador (Ventana decVentana)  {  this.decoradorVentana = decVentana;  }  }  // Añadimos funcionalidades a la ventana  public class BordeDecorador extends VentanaDecorador  {  public BordeDecorador (Ventana decoradorVentana)  {  super(decoradorVentana);  }  public void dibujar()  {  dibujarBorde();  decoradorVentana.dibujar();  }
Codificación: Ejemplo (III) private void dibujarBorde()  {  // dibujamos el borde de la ventana   }  public String getDescripcion()  {  return decoradorVentana.getDescripcion() + ", con borde";  }  }  public class BotonAyudaDecorador extends VentanaDecorador  {  public BotonAyudaDecorador (Ventana decoradorVentana)  {  super(decoradorVentana);  }  public void dibujar()  {  dibujarBotonAyuda();  decoradorVentana.dibujar();  }
Codificación: Ejemplo (y IV) private void dibujarBotonAyuda()  {  // dibujamos el botón de ayuda }  public String getDescripcion()  {  return decoradorVentana.getDescripcion() + ", con botón de  ayuda";  }  }  public class VentanaDecoradorTest  {  public static void main(String[] args)  {  Ventana decoradorVentana = new BotonAyudaDecorador (  new BordeDecorador(new VentanaConcreta()));  System.out.println(decoradorVentana.getDescripcion());  }  }
Reglas Implica utilizarlo si… una jerarquía de clases tiene muchos niveles. No se cumple si… entre una interfaz y su implementación no hay una abstracción.
Patrones relacionados Adapter Composite Strategy
Ventajas del patrón Decorator Más flexible que la  herencia : responsabilidades pueden añadirse y eliminarse en tiempo de ejecución. Diferentes decoradores pueden ser conectados a un mismo objeto. Reduce el número de propiedades en las clases de la parte alta de la jerarquía. Es simple añadir nuevos decoradores de forma independiente a las clases que extienden. Un objeto decorador tiene diferente  OID  (identificador único que proporciona el sistema) que el objeto que decora. Sistemas con muchos y pequeños objetos.

Más contenido relacionado

PPT
Lenguajes De Bajo Nivel
PPTX
Tutorial lenguaje c
PPTX
PPT
Present simple
PDF
ingles verbos irregulares
PPTX
Generaciones de los lenguajes de programacion
PDF
La computadora es una maquina electrónica que
PDF
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Lenguajes De Bajo Nivel
Tutorial lenguaje c
Present simple
ingles verbos irregulares
Generaciones de los lenguajes de programacion
La computadora es una maquina electrónica que
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch

Destacado (14)

PPTX
Observer: Patrón de diseño
PDF
Reyes de España desde 1492
DOCX
Cadena de responsabilidad.chaine of responsability
PDF
Patrones de diseño de software facade e iterator
PDF
Facade - Design Pattern - GoF
PPT
Ccna3 cap8 (1)
PDF
Patrones de diseño II
PDF
Patrón Observer
PPTX
Patrones de diseño II
PPT
Diseño de Patrones (Fachada)
PPT
Patrones bridge puente
PDF
Patrones de diseño de GoF
ODP
La Crisis De La Baja Edad Media
PDF
Patrones de diseño de software
Observer: Patrón de diseño
Reyes de España desde 1492
Cadena de responsabilidad.chaine of responsability
Patrones de diseño de software facade e iterator
Facade - Design Pattern - GoF
Ccna3 cap8 (1)
Patrones de diseño II
Patrón Observer
Patrones de diseño II
Diseño de Patrones (Fachada)
Patrones bridge puente
Patrones de diseño de GoF
La Crisis De La Baja Edad Media
Patrones de diseño de software
Publicidad

Similar a Decorator (20)

PPT
Patron decorador
PPTX
S09_s1-Patrones-Estructurales-DC_UDMERB (1).pptx
PPTX
Patron de diseño decorator
DOCX
Herencia y polimorfismo unidad 5 semestre 2
PDF
Tutorial 1 android
PDF
decorator
PPT
PPT
Presentacion Patrones De Diseno GoF
PPTX
Clase de uso, semantico y de clases
DOCX
Manual de android parte 1
PDF
Patrones diseno software
PPTX
Patrones de diseño.pptx
PPTX
programacion
PPTX
Programacion
PPTX
Tutorial net beans
PPTX
1TAP Tema 1-GUI.pptx
PPTX
PDF
Hola mundoconc sharp
PDF
primer codigo con C sharp
Patron decorador
S09_s1-Patrones-Estructurales-DC_UDMERB (1).pptx
Patron de diseño decorator
Herencia y polimorfismo unidad 5 semestre 2
Tutorial 1 android
decorator
Presentacion Patrones De Diseno GoF
Clase de uso, semantico y de clases
Manual de android parte 1
Patrones diseno software
Patrones de diseño.pptx
programacion
Programacion
Tutorial net beans
1TAP Tema 1-GUI.pptx
Hola mundoconc sharp
primer codigo con C sharp
Publicidad

Más de Mario Rodriguez (6)

PDF
Memoria PFC
PPT
Redes sociales
PPT
PFC LeELa player
PPT
SETI@home
PPT
Modelado basado en imágenes
PPT
La psicología de los objetos cotidianos - Cap 1
Memoria PFC
Redes sociales
PFC LeELa player
SETI@home
Modelado basado en imágenes
La psicología de los objetos cotidianos - Cap 1

Último (20)

PPTX
Control de calidad en productos de frutas
PPTX
la-historia-de-la-medicina Edna Silva.pptx
PDF
MANUAL de recursos humanos para ODOO.pdf
DOCX
Guía 5. Test de orientación Vocacional 2.docx
PPT
Protocolos de seguridad y mecanismos encriptación
PDF
Estrategia de apoyo valentina lopez/ 10-3
PDF
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
PPTX
Mecanismos-de-Propagacion de ondas electromagneticas
PPTX
Reconocimiento-Automatico-de-Placas-Vehiculares-con-IA.pptx
DOCX
Trabajo informatica joel torres 10-.....................
PPTX
Diapositivas Borrador Rocha Jauregui David Paolo (3).pptx
PDF
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
PPTX
El uso de las TIC en la vida cotidiana..
PPTX
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
PPTX
Uso responsable de la tecnología - EEST N°1
PPTX
Presentación final ingenieria de metodos
PDF
TRABAJO DE TECNOLOGIA.pdf...........................
PDF
capacitación de aire acondicionado Bgh r 410
PDF
informe_fichas1y2_corregido.docx (2) (1).pdf
PPTX
Curso de generación de energía mediante sistemas solares
Control de calidad en productos de frutas
la-historia-de-la-medicina Edna Silva.pptx
MANUAL de recursos humanos para ODOO.pdf
Guía 5. Test de orientación Vocacional 2.docx
Protocolos de seguridad y mecanismos encriptación
Estrategia de apoyo valentina lopez/ 10-3
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
Mecanismos-de-Propagacion de ondas electromagneticas
Reconocimiento-Automatico-de-Placas-Vehiculares-con-IA.pptx
Trabajo informatica joel torres 10-.....................
Diapositivas Borrador Rocha Jauregui David Paolo (3).pptx
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
El uso de las TIC en la vida cotidiana..
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
Uso responsable de la tecnología - EEST N°1
Presentación final ingenieria de metodos
TRABAJO DE TECNOLOGIA.pdf...........................
capacitación de aire acondicionado Bgh r 410
informe_fichas1y2_corregido.docx (2) (1).pdf
Curso de generación de energía mediante sistemas solares

Decorator

  • 1. Patrones de diseño DECORATOR Mario Rodríguez Martín
  • 2. Introducción También conocido como Wrapper. Propósito Estructural. Ámbito Objeto. Motivación A veces se desea adicionar responsabilidades a un objeto, pero no a toda la clase. Las responsabilidades se pueden adicionar por medio de los mecanismos de Herencia, pero este mecanismo no es flexible porque la responsabilidad es adicionada estáticamente. La solución flexible es la de rodear el objeto con otro objeto que es el que adiciona la nueva responsabilidad. Este nuevo objeto es el Decorator. Aplicabilidad El Decorator se debe usar para:    Adicionar responsabilidades a objetos individuales dinámicamente sin afectar otros objetos. Para agregar responsabilidades que pueden ser retiradas. Cuando no es práctico adicionar responsabilidades por medio de la herencia.
  • 3. Participantes y estructura Componente : Interfaz común a todas las clases susceptibles de ser ampliadas con el Decorador. ComponenteConcreto : Son las clases cuya funcionalidad se puede extender y en las que se delega en última instancia para realizar las operaciones propias de la clase.
  • 4. Participantes y estructura Decorador : Clase abstracta que declara la estructura común a todos los Decoradores y declara (o implementa, según sea el caso) la responsabilidad de mantener una referencia al objeto que se extiende. Es posible que sobrecargue todos los métodos de la clase Componente con llamadas al componente concreto, de forma que aquellos métodos cuya funcionalidad no se extiende simplemente llaman a los originales. DecoradorConcreto1 y DecoradorConcreto2 : Son clases concretas que heredan de Decorador e implementan las extensiones de funcionalidad de la clase original ComponenteConcreto.
  • 6. Problema que soluciona (Ejemplo) Supongamos que tenemos una clase existente Ventana y queremos añadirle funcionalidad para que muestre un borde alrededor. Podemos crear una subclase VentanaConBorde que herede de Ventana . Hasta aquí todo bien, pero supongamos que surge la necesidad de crear una ventana que muestre un pequeño botón de ayuda con un signo de interrogación (?) en su parte superior. Entonces tenemos las siguientes opciones: Crear otra subclase de Ventana : VentanaConBotónDeAyuda . Problema: No cubre la necesidad de tener ventanas con bordes y botón de ayuda a la vez. Crear una subclase de VentanaConBorde : VentanaConBordeYBotonDeAyuda . Problema: No tenemos una ventana con botón de ayuda y sin borde. Crear clases para todas las combinaciones posibles de funcionalidades. Problema: Con este ejemplo tendríamos cuatro clases: Ventana , VentanaConBorde , VentanaConBotonDeAyuda y VentanaConBordeYBotonDeAyuda ; con tres funcionalidades tendríamos ocho clases y con cuatro, ¡dieciséis!. Para n funcionalidades se necesitan 2 n clases.
  • 7. Implementación (Ejemplo) El patrón Decorator soluciona este problema de una manera mucho más sencilla y extensible. Se crea a partir de Ventana la subclase abstracta VentanaDecorador y, heredando de ella, BordeDecorador y BotonDeAyudaDecorador . VentanaDecorador encapsula el comportamiento de Ventana y utiliza composición recursiva para que sea posible añadir tantas "capas" de Decorators como se desee. Podemos crear tantos Decoradores como queramos heredando de VentanaDecorador .
  • 8. Codificación: Ejemplo (I) // Interfaz Ventana public interface Ventana { public void dibujar(); // dibuja la ventana public String getDescripcion(); // devuelve la descripción de la ventana } // Implementacion de una ventana concreta public class VentanaConcreta implements Ventana { public void dibujar() { // dibujamos la ventana } public String getDescripcion() { return “ventana simple”; } }
  • 9. Codificación: Ejemplo (II) // Clase abstracta VentanaDecorador – implementa a la clase Ventana public abstract class VentanaDecorador implements Ventana { protected Ventana decoradorVentana; public VentanaDecorador (Ventana decVentana) { this.decoradorVentana = decVentana; } } // Añadimos funcionalidades a la ventana public class BordeDecorador extends VentanaDecorador { public BordeDecorador (Ventana decoradorVentana) { super(decoradorVentana); } public void dibujar() { dibujarBorde(); decoradorVentana.dibujar(); }
  • 10. Codificación: Ejemplo (III) private void dibujarBorde() { // dibujamos el borde de la ventana } public String getDescripcion() { return decoradorVentana.getDescripcion() + ", con borde"; } } public class BotonAyudaDecorador extends VentanaDecorador { public BotonAyudaDecorador (Ventana decoradorVentana) { super(decoradorVentana); } public void dibujar() { dibujarBotonAyuda(); decoradorVentana.dibujar(); }
  • 11. Codificación: Ejemplo (y IV) private void dibujarBotonAyuda() { // dibujamos el botón de ayuda } public String getDescripcion() { return decoradorVentana.getDescripcion() + ", con botón de ayuda"; } } public class VentanaDecoradorTest { public static void main(String[] args) { Ventana decoradorVentana = new BotonAyudaDecorador ( new BordeDecorador(new VentanaConcreta())); System.out.println(decoradorVentana.getDescripcion()); } }
  • 12. Reglas Implica utilizarlo si… una jerarquía de clases tiene muchos niveles. No se cumple si… entre una interfaz y su implementación no hay una abstracción.
  • 13. Patrones relacionados Adapter Composite Strategy
  • 14. Ventajas del patrón Decorator Más flexible que la herencia : responsabilidades pueden añadirse y eliminarse en tiempo de ejecución. Diferentes decoradores pueden ser conectados a un mismo objeto. Reduce el número de propiedades en las clases de la parte alta de la jerarquía. Es simple añadir nuevos decoradores de forma independiente a las clases que extienden. Un objeto decorador tiene diferente OID (identificador único que proporciona el sistema) que el objeto que decora. Sistemas con muchos y pequeños objetos.