Designer Pattern Delegation em Java

Veja neste tutorial como funciona o padrão de projeto Delegation Pattern em Java, com exemplos de código para facilitar o entendimento.

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 1440 Visualizações

Antes de iniciar, saiba que essa postagem faz parte da sequência de posts relacionados a padrões de projetos, onde serão abordados todos os principais padrões utilizados.

Delegation Pattern

O Delegation Pattern é uma forma de delegar uma responsabilidade para outro objeto próximo. É onde o objeto expressa determinado comportamento para o exterior, deixando a responsabilidade de determinado comportamento para outro objeto.

A delegação é bem comum, muitas vezes usada por outros padrões, como: Visitor, Observer, Strategy e Event Listener, os quais serão demonstrados em outras postagens.

Onde usar Delegation Pattern

O que é um consenso geral, é use delegação como alternativa à herança. Quando existe um relacionamento próximo (Pai e Filho), a herança é uma boa estratégia, mas, ela agrupa objetos muito perto. A delegação é uma maneira mais flexível de expressar um relacionamento entre classes.


Dois cenários interessantes de uso são:

  • quando precisa reduzir o acoplamento de métodos à sua classe.
  • quando se tem componentes que se comportam de maneira idêntica, mas percebe que essa situação pode mudar no futuro.

Como funciona Delegation Pattern

Vamos analisar um exemplo prático de Delegation Pattern. Pense no seguinte cenário, precisamos que nossa classe retorne um valor convertido para Dólar e para Euro hipoteticamente. Então poderíamos ter uma classe da seguinte forma:

public class Conta {

    public Double saldo;


    public Double converterDolar(){
        return saldo * 3.66;
    }
	
	public Double converterEuro(){
        return saldo * 4.21;
    }

	// [...]
}

Note que dessa forma para cada nova moeda que precisamos converter precisaríamos criar um método para cada situação.

Pensando em delegar essa responsabilidade, podemos tornar nossa classe mais flexível. Para isso criaremos a interface Conversor.

public interface Conversor {
    Double converter(Double valor);
}

Agora podemos modificar a classe Conta para usar a interface do conversor.

public class Conta {

    public Double saldo;

    public Double converter(Conversor conversor){
        return conversor.converter(saldo);
    }

    // [getters e setters]
}

Note que removemos os dois métodos que convertiam para dólar e euro por um método chamador converter que recebe um conversor.

Agora podemos criar quantos conversores quisermos. Veja:

public class DolarConverter implements Conversor {

    public Double converter(Double valor) {
        return valor * 3.66;
    }
}
public class EuroConverter implements Conversor {

    public Double converter(Double valor) {
        return valor * 4.21;
    }
}

Agora podemos utilizar os conversores da seguinte forma:

public class Main {

    public static void main(String[] args) {
        Conta conta = new Conta();
        conta.setSaldo(10.0);

        System.out.println(conta.getSaldo());
        System.out.println(conta.converter(new DolarConverter()));
        System.out.println(conta.converter(new EuroConverter()));
    }
}

Note que quando precisamos converter para Dólar, usarmos conta.converter(new DolarConverter()), assim delegamos a responsabilidade de converter o valor para outro objeto desacoplando o código.

Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.



Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!