Método del decorador: patrones de diseño de Python

El método Decorator es un patrón de diseño estructural que le permite adjuntar dinámicamente nuevos comportamientos a los objetos sin cambiar su implementación al colocar estos objetos dentro de los objetos envolventes que contienen los comportamientos. 
Es mucho más fácil implementar el método Decorator en Python debido a su función integrada. No es equivalente a Herencia porque la nueva característica se agrega solo a ese objeto en particular, no a toda la subclase.
 

Problema sin usar el método Decorator

Imagine que estamos trabajando con una herramienta de formato que proporciona funciones como negrita y subrayado. Pero después de un tiempo, nuestras herramientas de formato se hicieron famosas entre el público objetivo y, al recibir los comentarios, obtuvimos que nuestro público deseaba más funciones en la aplicación, como poner el texto en cursiva y muchas otras funciones. 
¿Parece sencillo? No es una tarea fácil implementar esto o extender nuestras clases para agregar más funcionalidades sin perturbar el código del cliente existente porque tenemos que mantener el principio de responsabilidad única .
 

Solución usando el método del decorador

Ahora veamos la solución que tenemos para evitar tales condiciones. Inicialmente, solo tenemos Texto escrito , pero tenemos que aplicar filtros como NEGRITA, CURSIVA, SUBRAYADO . Por lo tanto, crearemos clases contenedoras separadas para cada función, como BoldWrapperClass, ItalicWrapperClass y UnderlineWrapperclass.
 

Decorator-Written-Text

Decorador-Escrito-Texto

Primero, llamaremos a BoldWrapperclass sobre el texto escrito que finalmente convierte el texto en letras BOLD
 

Decorator-Wrapper

Decorador-Envoltorio

Luego aplicaremos ItalicWrapperClass y UnderlineWrapperClass sobre el texto en negrita, lo que nos dará el resultado que queremos.
 

Decorator-Underline

Decorador-Subrayado

El siguiente código está escrito usando el método Decorator: 
 

Python3

class WrittenText:
 
    """Represents a Written text """
 
    def __init__(self, text):
        self._text = text
 
    def render(self):
        return self._text
 
class UnderlineWrapper(WrittenText):
 
    """Wraps a tag in <u>"""
 
    def __init__(self, wrapped):
        self._wrapped = wrapped
 
    def render(self):
        return "<u>{}</u>".format(self._wrapped.render())
 
class ItalicWrapper(WrittenText):
 
    """Wraps a tag in <i>"""
 
    def __init__(self, wrapped):
        self._wrapped = wrapped
 
    def render(self):
        return "<i>{}</i>".format(self._wrapped.render())
 
class BoldWrapper(WrittenText):
 
    """Wraps a tag in <b>"""
 
    def __init__(self, wrapped):
        self._wrapped = wrapped
 
    def render(self):
        return "<b>{}</b>".format(self._wrapped.render())
 
""" main method """
 
if __name__ == '__main__':
 
    before_gfg = WrittenText("GeeksforGeeks")
    after_gfg = ItalicWrapper(UnderlineWrapper(BoldWrapper(before_gfg)))
 
    print("before :", before_gfg.render())
    print("after :", after_gfg.render())

Diagrama de clases para el método Decorator

El siguiente es el diagrama de clases para Decorator Method: 
 

Decorator-Class-diagram

Decorador-clase-diagrama

Ventajas

  • Principio de responsabilidad única: es fácil dividir una clase monolítica que implementa muchas variantes posibles de comportamiento en varias clases utilizando el método Decorator.
  • Responsabilidades de tiempo de ejecución: podemos agregar o eliminar fácilmente las responsabilidades de un objeto en tiempo de ejecución.
  • Subclasificación: el patrón decorador es una alternativa a la subclasificación. La creación de subclases agrega comportamiento en tiempo de compilación y el cambio afecta a todas las instancias de la clase original; La decoración puede proporcionar un nuevo comportamiento en tiempo de ejecución para objetos individuales.

Desventajas

  1. Eliminación de envoltorio : es muy difícil eliminar un envoltorio en particular de la pila de envoltorios.
  2. Decoradores complicados: puede ser complicado hacer que los decoradores realicen un seguimiento de otros decoradores, porque mirar hacia atrás en múltiples capas de la string de decoradores comienza a empujar el patrón del decorador más allá de su verdadera intención.
  3. Configuración fea: una gran cantidad de código de capas puede hacer que las configuraciones sean feas.

Aplicabilidad

  1. Herencia incapaz: generalmente, el método Decorator se usa cuando no es posible extender el comportamiento de un objeto usando la herencia.
  2. Asignación de tiempo de ejecución: una de las características más importantes del método Decorator es asignar comportamientos diferentes y únicos al objeto en el tiempo de ejecución .

Lectura adicional: patrón de diseño de decorador en Java
 

Publicación traducida automáticamente

Artículo escrito por chaudhary_19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *