Skip to main content

Decorator

  • Decorator

Intenção

  • O Decorator é um padrão de projeto estrutural que permite que você acople novos comportamentos para objetos ao colocá-los dentro de invólucros de objetos que contém os comportamentos. Adiciona novas responsabilidade

Pseudocódigo

alt text

Exemplo

using System;

// Interface básica para pedidos
public interface IOrder
{
decimal CalculateTotal();
}

// Implementação concreta de um pedido simples
public class BasicOrder : IOrder
{
private decimal _orderAmount;

public BasicOrder(decimal orderAmount)
{
_orderAmount = orderAmount;
}

public decimal CalculateTotal()
{
return _orderAmount;
}
}

// Decorator base que implementa a interface IOrder
public abstract class OrderDecorator : IOrder
{
protected IOrder _order;

public OrderDecorator(IOrder order)
{
_order = order;
}

public virtual decimal CalculateTotal()
{
return _order.CalculateTotal();
}
}

// Decorator que aplica um desconto
public class DiscountDecorator : OrderDecorator
{
private decimal _discountPercentage;

public DiscountDecorator(IOrder order, decimal discountPercentage)
: base(order)
{
_discountPercentage = discountPercentage;
}

public override decimal CalculateTotal()
{
var total = base.CalculateTotal();
return total - (total * _discountPercentage / 100);
}
}

// Decorator que adiciona uma taxa de serviço
public class ServiceChargeDecorator : OrderDecorator
{
private decimal _serviceCharge;

public ServiceChargeDecorator(IOrder order, decimal serviceCharge)
: base(order)
{
_serviceCharge = serviceCharge;
}

public override decimal CalculateTotal()
{
var total = base.CalculateTotal();
return total + _serviceCharge;
}
}

class Program
{
static void Main()
{
// Pedido básico de 100
IOrder order = new BasicOrder(100);

// Adicionar um desconto de 10%
order = new DiscountDecorator(order, 10);

// Adicionar uma taxa de serviço de 5 unidades monetárias
order = new ServiceChargeDecorator(order, 5);

// Calcular o total final
decimal total = order.CalculateTotal();

Console.WriteLine($"Total final: {total}"); // Resultado: 95
}
}

Anotações

  • Adiciona novas responsabilidades e comportamentos