O padrão Decorator permite adicionar novas funcionalidades a objetos de forma dinâmica, sem precisar modificar as classes originais. É útil quando você quer estender as funcionalidades de um objeto sem mexer no código original ou criar subclasses complexas. Um exemplo prático seria um sistema de notificação, onde você pode enviar notificações por e-mail, SMS ou ambos, dependendo de como o objeto foi decorado.
Exemplo de Código em C#:
// Componente base
public interface INotificacao
{
void EnviarMensagem(string mensagem);
}
// Componente concreto
public class NotificacaoEmail : INotificacao
{
public void EnviarMensagem(string mensagem)
{
Console.WriteLine($"Enviando e-mail: {mensagem}");
}
}
// Decorador base
public abstract class NotificacaoDecorator : INotificacao
{
protected INotificacao _notificacao;
public NotificacaoDecorator(INotificacao notificacao)
{
_notificacao = notificacao;
}
public virtual void EnviarMensagem(string mensagem)
{
_notificacao.EnviarMensagem(mensagem);
}
}
// Decorador concreto para SMS
public class NotificacaoSMSDecorator : NotificacaoDecorator
{
public NotificacaoSMSDecorator(INotificacao notificacao) : base(notificacao) { }
public override void EnviarMensagem(string mensagem)
{
base.EnviarMensagem(mensagem);
Console.WriteLine($"Enviando SMS: {mensagem}");
}
}
class Program
{
static void Main(string[] args)
{
// Enviar notificação por e-mail
INotificacao notificacaoEmail = new NotificacaoEmail();
notificacaoEmail.EnviarMensagem("Olá!");
// Enviar notificação por e-mail e SMS
INotificacao notificacaoComSMS = new NotificacaoSMSDecorator(notificacaoEmail);
notificacaoComSMS.EnviarMensagem("Olá!");
}
}
Explicação do Código:
Neste exemplo, temos a interface INotificacao, que define a operação de enviar mensagens. A classe NotificacaoEmail envia notificações por e-mail, enquanto o decorador NotificacaoSMSDecorator adiciona a funcionalidade de enviar uma mensagem SMS, além do e-mail. No código principal, a primeira notificação é enviada apenas por e-mail, e a segunda é enviada tanto por e-mail quanto por SMS, graças ao decorador.
Conclusão:
O padrão Decorator permite adicionar funcionalidades a objetos sem alterar suas classes originais. Ele é útil para quando você quer aplicar diferentes funcionalidades de forma flexível e combinável, como em sistemas de notificação, onde você pode adicionar tipos diferentes de alertas sem modificar a lógica principal.
Código fonte: GitHub
Top comments (0)