Criando um Padrão de Projetos Decorator para Notificações de Feedback em Java

O padrão de projetos Decorator é uma poderosa ferramenta de design de software que permite estender a funcionalidade de objetos de maneira dinâmica e flexível.

Já temos aqui no site um conteúdo detalhado sobre o padrão de projetos Decorator, portanto, neste artigo, vamos focar mais na prática de sua aplicação.

Vamos explorar como aplicar esse padrão para construir um sistema de notificações de feedback para usuários, com ênfase em diferentes tipos de notificações de bloqueio.

Através de exemplos práticos em Java, você aprenderá a implementar e combinar essas notificações de forma eficiente.

Introduzindo a Aplicação do Padrão de Projetos Decorator de Notificações

Para esta aplicação, vamos considerar o seguinte cenário: precisamos implementar regras de notificação para a autenticação de usuários ao realizarem login no sistema.

Vamos implementar de forma simples e bem definida, utilizando exemplos que realmente são aplicados em sistemas do mundo real. Dessa forma, o entendimento da aplicação deste padrão será mais claro.

Os decoradores serão responsáveis por criar notificações para cada uma das operações de notificação. Vamos utilizar as seguintes regras:

  • Notificação de bloqueio do usuário
    • Notificação de bloqueio por inatividade de 7 dias sem acessar o sistema.
    • Notificação de bloqueio após errar a senha até 3 vezes.
    • Notificação de bloqueio manual pelo Administrador do sistema.
  • Notificação de vencimento de senha
    • Notificação de bloqueio após o vencimento da senha e a mesma não ser alterada.
  • Notificação de redefinição de senha
    • Notificação de envio de redefinição de senha por e-mail.

Com estas regras bem definidas, podemos seguir para a implementação dos decoradores que irão gerar as notificações conforme necessário.

Passo 1: Definindo a Interface de Notificação

A primeira etapa é criar uma interface base para todas as notificações.

Esta interface define o método essencial enviarNotificacao, que será implementado pelas classes concretas.

public interface Notificacao {
    void enviarNotificacao(String mensagem);
}

Passo 2: implementação Base de Notificação

Em seguida, precisamos de uma implementação concreta base desta interface.

public class NotificacaoBase implements Notificacao {
    @Override
    public void enviarNotificacao(String mensagem) {
        System.out.println("Notificação: " + mensagem);
    }
}

Passo 3: Criando a Classe Decorator Abstrata

Para implementar o padrão de projetos Decorator, criamos uma classe abstrata que implementa a interface Notificacao e recebe uma instância de Notificacao. Esta classe decoradora encaminha as chamadas do método enviarNotificacao para a instância encapsulada.

public abstract class NotificacaoDecorator implements Notificacao {
    protected Notificacao notificacaoDecorada;

    public NotificacaoDecorator(Notificacao notificacaoDecorada) {
        this.notificacaoDecorada = notificacaoDecorada;
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        notificacaoDecorada.enviarNotificacao(mensagem);
    }
}

Passo 4: Implementando os Decorators Concretos

Agora que temos nossa estrutura básica, podemos criar diferentes tipos de notificações de bloqueio como decoradores concretos.

Cada decorador adiciona informações específicas à mensagem antes de enviá-la.

4.1. Notificação de Bloqueio por Inatividade

public class NotificacaoBloqueioInatividade extends NotificacaoDecorator {

    public NotificacaoBloqueioInatividade(Notificacao notificacaoDecorada) {
        super(notificacaoDecorada);
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        super.enviarNotificacao(mensagem);
        enviarNotificacaoInatividade();
    }

    private void enviarNotificacaoInatividade() {
        System.out.println("Usuário bloqueado por inatividade de 7 dias.");
    }
}

4.2. Notificação de Bloqueio por Tentativas de Senha

public class NotificacaoBloqueioTentativas extends NotificacaoDecorator {

    public NotificacaoBloqueioTentativas(Notificacao notificacaoDecorada) {
        super(notificacaoDecorada);
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        super.enviarNotificacao(mensagem);
        enviarNotificacaoTentativas();
    }

    private void enviarNotificacaoTentativas() {
        System.out.println("Usuário bloqueado após errar a senha até 3 vezes.");
    }
}

4.3. Notificação de Bloqueio Manual pelo Administrador

public class NotificacaoBloqueioManual extends NotificacaoDecorator {

    public NotificacaoBloqueioManual(Notificacao notificacaoDecorada) {
        super(notificacaoDecorada);
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        super.enviarNotificacao(mensagem);
        enviarNotificacaoManual();
    }

    private void enviarNotificacaoManual() {
        System.out.println("Usuário bloqueado manualmente pelo Administrador.");
    }
}

4.4. Notificação de Vencimento de Senha

public class NotificacaoVencimentoSenha extends NotificacaoDecorator {

    public NotificacaoVencimentoSenha(Notificacao notificacaoDecorada) {
        super(notificacaoDecorada);
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        super.enviarNotificacao(mensagem);
        enviarNotificacaoVencimento();
    }

    private void enviarNotificacaoVencimento() {
        System.out.println("Usuário bloqueado após o vencimento da senha.");
    }
}

4.5. Notificação de Redefinição de Senha por E-mail

public class NotificacaoRedefinicaoSenha extends NotificacaoDecorator {

    public NotificacaoRedefinicaoSenha(Notificacao notificacaoDecorada) {
        super(notificacaoDecorada);
    }

    @Override
    public void enviarNotificacao(String mensagem) {
        super.enviarNotificacao(mensagem);
        enviarNotificacaoRedefinicao();
    }

    private void enviarNotificacaoRedefinicao() {
        System.out.println("E-mail de redefinição de senha enviado.");
    }
}

Passo 5: Usando os Decorators

Com todas as classes implementadas, podemos agora demonstrar como utilizá-las para enviar diferentes tipos de notificações. Vamos ver alguns exemplos de uso.

public class Main {
    public static void main(String[] args) {
        Notificacao notificacao = new NotificacaoBase();

        // Aplicando vários decoradores
        notificacao = new NotificacaoBloqueioInatividade(notificacao);
        notificacao = new NotificacaoBloqueioTentativas(notificacao);
        notificacao = new NotificacaoBloqueioManual(notificacao);
        notificacao = new NotificacaoVencimentoSenha(notificacao);
        notificacao = new NotificacaoRedefinicaoSenha(notificacao);

        // Enviando a notificação
        notificacao.enviarNotificacao("Aviso: ações de segurança necessárias.");
    }
}

Conclusão: Padrão de projetos Decorator para Notificações de Feedback

O padrão de projetos Decorator nos permite estender a funcionalidade de objetos de maneira dinâmica e flexível, sem a necessidade de modificar suas classes existentes.

No exemplo abordado, implementamos um sistema de notificações de feedback que pode ser facilmente ampliado com novos tipos de notificações, bastando criar novos decoradores.

Esse design promove um código mais modular, escalável e fácil de manter, sendo uma excelente escolha para muitos cenários em desenvolvimento de software.

Com isso, você tem uma base sólida para aplicar o padrão Decorator em seus próprios projetos, aprimorando a arquitetura de suas aplicações e garantindo maior flexibilidade na adição de novas funcionalidades.

Marcos R.S
Marcos R.S

Olá, pessoal! Sou Marcos, apaixonado por aprender, especialmente sobre tecnologia. Estou sempre em busca de lapidar os conhecimentos que já possuo e adquirir novos. Atuo com análise e desenvolvimento de sistemas, sou graduando em Sistemas de Informação e tenho formação técnica em Informática.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *