Saltar al contenido

Comprender el “Patrón Decorador” con un ejemplo del mundo real

Después de tanto luchar ya encontramos la contestación de esta duda que algunos los lectores de este sitio web presentan. Si deseas aportar algún detalle puedes dejar tu conocimiento.

Solución:

El patrón Decorator logra un único objetivo de agregar dinámicamente responsabilidades a cualquier objeto.

Considere el caso de una pizzería. En la pizzería venderán pocas variedades de pizza y también ofrecerán ingredientes en el menú. Ahora imagine una situación en la que la pizzería tenga que proporcionar precios para cada combinación de pizza y aderezo. Aunque haya cuatro pizzas básicas y 8 toppings diferentes, la aplicación se volvería loca manteniendo todas estas combinaciones concretas de pizzas y toppings.

Aquí viene el patrón decorador.

Según el patrón del decorador, implementará ingredientes como decoradores y las pizzas serán decoradas por los decoradores de esos ingredientes. Prácticamente cada cliente querría los ingredientes de su deseo y el monto final de la factura estará compuesto por las pizzas base y los ingredientes pedidos adicionalmente. Cada decorador de aderezos sabría acerca de las pizzas que está decorando y su precio. El método GetPrice() del objeto Topping devolvería el precio acumulado tanto de la pizza como del topping.

EDITAR

Aquí hay un ejemplo de código de la explicación anterior.

public abstract class BasePizza

    protected double myPrice;

    public virtual double GetPrice()
    
        return this.myPrice;
    


public abstract class ToppingsDecorator : BasePizza

    protected BasePizza pizza;
    public ToppingsDecorator(BasePizza pizzaToDecorate)
    
        this.pizza = pizzaToDecorate;
    

    public override double GetPrice()
    
        return (this.pizza.GetPrice() + this.myPrice);
    


class Program

    [STAThread]
    static void Main()
    
        //Client-code
        Margherita pizza = new Margherita();
        Console.WriteLine("Plain Margherita: " + pizza.GetPrice().ToString());

        ExtraCheeseTopping moreCheese = new ExtraCheeseTopping(pizza);
        ExtraCheeseTopping someMoreCheese = new ExtraCheeseTopping(moreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese: " + someMoreCheese.GetPrice().ToString());

        MushroomTopping moreMushroom = new MushroomTopping(someMoreCheese);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom: " + moreMushroom.GetPrice().ToString());

        JalapenoTopping moreJalapeno = new JalapenoTopping(moreMushroom);
        Console.WriteLine("Plain Margherita with double extra cheese with mushroom with Jalapeno: " + moreJalapeno.GetPrice().ToString());

        Console.ReadLine();
    


public class Margherita : BasePizza

    public Margherita()
    
        this.myPrice = 6.99;
    


public class Gourmet : BasePizza

    public Gourmet()
    
        this.myPrice = 7.49;
    


public class ExtraCheeseTopping : ToppingsDecorator

    public ExtraCheeseTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    
        this.myPrice = 0.99;
    


public class MushroomTopping : ToppingsDecorator

    public MushroomTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    
        this.myPrice = 1.49;
    


public class JalapenoTopping : ToppingsDecorator

    public JalapenoTopping(BasePizza pizzaToDecorate)
        : base(pizzaToDecorate)
    
        this.myPrice = 1.49;
    

Este es un ejemplo simple de cómo agregar dinámicamente un nuevo comportamiento a un objeto existente, o el patrón Decorator. Debido a la naturaleza de los lenguajes dinámicos como Javascript, este patrón se convierte en parte del propio lenguaje.

// Person object that we will be decorating with logging capability
var person = 
  name: "Foo",
  city: "Bar"
;

// Function that serves as a decorator and dynamically adds the log method to a given object
function MakeLoggable(object) 
  object.log = function(property) 
    console.log(this[property]);
  


// Person is given the dynamic responsibility here
MakeLoggable(person);

// Using the newly added functionality
person.log('name');

Vale la pena señalar que el modelo de E/S de Java se basa en el patrón de decorador. La superposición de este lector encima de ese lector encima de… es un ejemplo real de decorador.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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