Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 1 da Aula 4 - Comportamentos compostos por outros comportamentos e o Decorator

Olá Marcos! Não entendi muito bem sua dúvida sobre as condições dos impostos. Poderia esclarecer?

8 respostas

no video ele coloca apenas uma condição, tipo na classe ISS por exemplo

calcula(Orcamento orcamento){ return orcamento.getValor 0.05 outroImposto.calcula(Orcamento)

é uma condição só

isso se aplica assim ?

calcula(Orcamento orcamento){

if(orcamento.get valor > 1000 ) {

return orcamento.getValor 0.07 + outroImposto(orcamento); }else{ orcamento.getValor 0.03 + outroImposto(orcamento);

nesse método é diferente dos outros anteriores.

no Strategy , eu que escolho qual vai calcular no Responsibility ele verifica um desconto, caso não seja , ele vai para o proximo

já nesse caso, ele vai passar por todos os impostos ,e como se fosse um bolo , onde cada imposto vai tirar uma fatia seja ela maior ou menor , e no final mostra o quanto tirou do total, foi isso que eu entendi.. está certo ?

Acho que entendi agora Marcos. O padrão Decorator consiste na implementação de comportamentos compostos, ou seja, ele aplica a regra de negocio dos impostos uma sobre a outra. De forma mais direta seria calcular o imposto do imposto, ou seja, pegar um valor e calcular o ISS e do resultado calcular o ICMS. É assim que funciona.

Espero ter ajudado! Bons Estudos!

só para ficar claro.

Então essa regra tb se aplica né

calcula(Orcamento orcamento){

if(orcamento.get valor > 1000 ) {

return orcamento.getValor 0.07 + outroImposto(orcamento); }

else{ orcamento.getValor 0.03 + outroImposto(orcamento);

Como assim se aplica?

é que no video ele faz usando apenas uma condição, sem uso de if

no video...

calcula(Orcamento orcamento)

{ return orcamento.getValor 0.05 outroImposto.calcula(Orcamento); }

agora olha como eu fiz só para teste

public class ICMP extends Imposto {

    public ICMP(Imposto imposto) {
        super(imposto);
    }

    @Override
    protected double calcula(Orcamento orcamento) {

        if(orcamento.getValor() >= 500){

            return orcamento.getValor() * 0.1 + outroImposto(orcamento);
        }
        return orcamento.getValor() * 0.03 + outroImposto(orcamento);
    }

}


public class ICKV extends Imposto {

    public ICKV(Imposto imposto) {
        super(imposto);
    }

    public ICKV() {}



    @Override
    public double calcula(Orcamento orcamento) {

        if(valorMaisSomaTotal(orcamento)){

            return orcamento.getValor() * 0.1 + outroImposto(orcamento);
        }else{

            return orcamento.getValor() * 0.05 + outroImposto(orcamento);
        }


    }
    /**
     * 
     * @param orcamento recebe a lista de Produtos
     * @return verdadeiro ,caso o valor do orcamento
     *  seja maior que 500, e a soma total
     * de produtos for maior de 300 
     */
    private boolean valorMaisSomaTotal(Orcamento orcamento) {
        double somaTotal = 0;
        for(Produto produto : orcamento.getProdutos()){
            somaTotal += produto.getValor();
        }

        return orcamento.getValor() >= 500 && somaTotal >= 300;
    }
}

errei ali no comentario é >= :)

solução

Marcos, não tem nenhum problema fazer do jeito que você fez. Você apenas adicionou uma condição, mas ainda continua utilizando a aplicação do Decorator

No video ele não coloca, mas eu posso usar as condições dos impostos nesse caso ? ou nesse caso, cada imposto vai retornar apenas uma coisa ? O que também eu fiquei meio confuso é que a variavel que recebe o calcula, ela é praticamente um acumulador.