Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida no Ex. 1 da Aula 4 - Comportamentos compostos por outros comportamentos e o 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.

8 respostas

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

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