Decorator: Personalize Seu Carro no Mundo da Programação 🚗🛠️

RMAG news

Seguindo nossa trilha de artigos sobre desing de código, hoje vamos abordar mais um concieto estrutural, vamos falar de Decorator:

Você já pensou em dar um “upgrade” no seu carro sem precisar comprar um novo? Na programação, o padrão Decorator permite fazer exatamente isso com seus objetos! 💡

Imagine seu carro como um objeto. Ele funciona bem, mas você quer adicionar alguns “acessórios”:

📻 Rádio: Para ouvir suas músicas favoritas enquanto programa.

🏎️Aerofólio: Para dar um toque de esportividade ao seu código.

✨Rodas de Liga Leve: Porque seu código merece um visual moderno.

Em vez de criar um novo carro para cada combinação de acessórios, o Decorator te permite adicionar (ou remover!) essas funcionalidades dinamicamente. É como encaixar peças de Lego para construir o carro dos seus sonhos! 🧱

Como Funciona? 🤔

Interface do Carro: Define os métodos básicos que todo carro deve ter (acelerar, frear, etc.).

Seu carro: Implementa essa interface, representando o carro básico.

Decoradores: Cada acessório (rádio, aerofólio, rodas) é um decorador. Eles “envolvem” o Fusca, adicionando sua própria funcionalidade sem alterar o carro original.

Vantagens do Decorator: Flexibilidade: Adicione ou remova acessórios em tempo de execução, como trocar de rádio ou tirar o aerofólio.

Reuso: Use os mesmos acessórios em diferentes carros (objetos), economizando tempo e esforço.

Manutenção: Alterações em um acessório não afetam o funcionamento dos outros ou do carro base.

Aderência ao Princípio Aberto/Fechado: Estenda o comportamento do seu código sem modificar as classes existentes.

Exemplo Prático com Go: Enviar notificações Decoradas ✉️🔔📢

Imagine um sistema de envio de notificações onde podemos enviar mensagens por e-mail, SMS ou até mesmo exibir um alerta na tela. Usaremos o Decorator para adicionar funcionalidades extras, como registro de log e formatação da mensagem.

Vamos criar uma interface INotificar, e adicionar nele o método Enviar que todos os tipos de notificadores devem implementar.

type INotificar interface {
Enviar(mensagem string) error
}

Com nossa interface criada, agora vamos implementar duas classes que vai ter o método Enviar definido: NotificarEmail e NotificarSMS
_
notificar_email.go_

type NotificarEmail struct{}

func (n *NotificarEmail) Enviar(mensagem string) error {
fmt.Println(“Enviando e-mail:”, mensagem)
return nil
}

Como as classes NotificarEmail e NotificarSMS criadas, vamos agora criar o Decorator que vai ser a base que injeta a interface INotificar

type DecoratorNotificar struct {
notificar INotificar
}

func (d * DecoratorNotificar) Enviar(mensagem string) error {
return d.notificar.Enviar(mensagem)
}

Antes de enviar qualquer notificação, vamos registra um log para rastrear nossas notificações, então para que isso aconteça vamos criar uma nova classe que vai ser responsável por esse registro do tipo log.

type INotificarLog struct {
DecoratorNotificar
}

func (n *INotificarLog) Enviar(mensagem string) error {
fmt.Println(“Log:”, mensagem)
return n.notificar.Enviar(mensagem)
}

Bom, vocês devem estar pensando mais caso eu precise enviar um SMS com uma formatação diferente de um e-mail, como posso fazer essa diferenciação. Pensando nessa situação podemos criar uma classe que vai ser responsável pela formatação da nossa mensagem.

type NotificacaoFormatada struct {
DecoratorNotificar
}

func (n *NotificacaoFormatada) Enviar(mensagem string) error {
mensagemFormatada := fmt.Sprintf(“[URGENTE] %s”, mensagem)
return n.notificar.Enviar(mensagemFormatada)
}

Agora com nossa estrutura de classes criadas e nosso _Decorator _realizando a abstração do método Enviar, vamos criar nosso arquivo main.go, que é o cara responsável por iniciar nossa aplicação em go.

func main() {
notificarEmail := &NotificarEmail{}
notificarSMS := &NotificarSMS{}

notificarEmailComLog := &NotificarLog{DecoratorNotificar{notificadorEmail}}
notificarSMSFormatado := &NotificarFormatado{ DecoratorNotificar{notificadorSMS}}

notificarEmailComLog.Enviar(“Reunião importante amanhã!”)
notificarSMSFormatado.Enviar(“Promoção imperdível!”)
}

Ao executar em nosso console o comando go run main.go, vamos ter a seguinte saída:

Log: Reunião importante amanhã!
Enviando e-mail: Reunião importante amanhã!
Enviando SMS: [URGENTE] Promoção imperdível!

Este é um exemplo simplificado. Em um cenário real, você teria mais detalhes de implementação (envio real de e-mails/SMS, formatação mais elaborada, etc.).

O Decorator permite combinar diferentes decoradores para criar notificadores com várias funcionalidades extras. Esse design ajuda muito a dar novos update em classes da nossa aplicação sem precisar realizarmos grande, alterações estruturais em nossa aplicação, sem precisar trocar de carro.

Please follow and like us:
Pin Share