Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] O Pattern Template Method e objetos em tempo de execucao

Esse referencia Desconto cadeiaDeDescontos em tempo de execucao tera uma referencia ao objeto DescontoParaOrcamentoComMaisDeCincoItens , e este com DescontoParaOrcamentoComValorMaiorQueQuinhentos, que tera com SemDesconto

Como esses objetos sao extensoes de Desconto, durante a execucao eles terao de forma concreta os tres metodos:

  1. calcular (igual aos 3, por que e definido na classe mae)

Contudo estes sao distintos, por que possuem sua propria implementacao em cada classe que extende a mae, onde que a mae declara-os como abstratos.

  1. efetuar calculo
  2. deveAplicar

Entao o reuso e possivel porque existe essa relacao de heranca entre a classe mae e a classe filha, onde a mae usa dos metodos implementados pelo filha, por meio do mecanismo abstract, que garante essa implementacao, e em tempo de execucao internamente acessa o tipo do objeto, que encontra as implementacoes necessarias.

Teremos tres objetos ? que por heranca carregam a classe Desconto em tempo de execucao pela jvm

  1. DescontoParaOrcamentoComMaisDeCincoItens
  2. DescontoParaOrcamentoComValorMaiorQueQuinhentos
  3. SemDesconto
package br.com.alura.loja.desconto;

import java.math.BigDecimal;

import br.com.alura.loja.orcamento.Orcamento;

public class CalculadoraDeDescontos {

    public BigDecimal calcular(Orcamento orcamento) {
        Desconto cadeiaDeDescontos = new DescontoParaOrcamentoComMaisDeCincoItens(
                    new DescontoParaOrcamentoComValorMaiorQueQuinhentos(
                            new SemDesconto()
                        )
                );

        return cadeiaDeDescontos.calcular(orcamento);
    }

}
1 resposta
solução!

Boa noite Eduardo.

Fiz um teste análogo utilizando uma classe abstrata e três classes concretas. Seu pensamento está correto, apenas 3 objetos são de fato instânciadas na JVM em tempo de execução.


public abstract class Abstract {
    void print(String value) {
        System.out.println(value);
    }
}

public class ImplementedOne extends Abstract{

}

... o mesmo para Two e Three.


public class AbstractTest {

    public static void main(String[] args) {

        ImplementedOne one = new ImplementedOne();
        ImplementedTwo two = new ImplementedTwo();
        ImplementedThree three = new ImplementedThree();

        one.print("Hello from One");
        two.print("Hello from Two");
        three.print("Hello from Three");

        System.out.println("End");
    }

}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade