Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Resolução

Gostei de ter usado a Interface nesse exercício.

package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public abstract class Pagamento {

    private BigDecimal valor;

    public Pagamento(BigDecimal valor) {
        this.valor = valor;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public abstract void confirmarPagamento();
}
package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public class BoletoBancario extends Pagamento implements Taxa {

    public BoletoBancario(BigDecimal valor) {
        super(valor);
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Boleto de R$%.2f gerado com sucesso (Taxa: R$%.2f)\n", getValor(), aplicaTaxa());
    }

    @Override
    public BigDecimal aplicaTaxa() {
        BigDecimal taxa = new BigDecimal("1.00").divide(new BigDecimal("100"));
        taxa = taxa.multiply(getValor());
        return taxa;
    }
}
package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public class CartaoCredito extends Pagamento implements Taxa {

    public CartaoCredito(BigDecimal valor) {
        super(valor);
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Pagamento de R$%.2f confirmado no Cartão de Crédito (Taxa: R$%.2f)\n", getValor(), aplicaTaxa());
    }

    @Override
    public BigDecimal aplicaTaxa() {
        BigDecimal taxa = new BigDecimal("3.00").divide(new BigDecimal("100"));
        taxa = taxa.multiply(getValor());
        return taxa;
    }
}
package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public class Pix extends Pagamento {

    public Pix(BigDecimal valor) {
        super(valor);
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Pagamento via Pix de R$%.2f confirmado\n", getValor());
    }
}
package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public interface Taxa {

    BigDecimal aplicaTaxa();

}
/**
 * Você está desenvolvendo o núcleo de processamento para uma fintech. A startup precisa de um sistema
 * que possa acomodar diferentes métodos de pagamento, cada um com suas particularidades de confirmação
 * e regras de taxação. Seu desafio é criar uma estrutura que unifique o essencial, mas permita
 * comportamentos específicos para cada forma de pagamento.
 *
 * Crie um programa que:
 *
 * Defina uma classe base Pagamento com o atributo valor.
 * Cada subclasse (CartaoCredito, BoletoBancario e Pix) implementa sua própria lógica de confirmação
 * e cálculo de taxas.
 * Cartão: 3%.
 * Boleto: 1%
 * Pix: sem taxas
 * Exiba a mensagem de confirmação no console e mostre o valor da taxa.
 * Exemplo de entrada:
 *
 * Pagamento cartao = new CartaoCredito(250.00);
 * Pagamento boleto = new BoletoBancario(500.00);
 * Pagamento pix = new Pix(300.00);
 *
 * cartao.confirmarPagamento();
 * boleto.confirmarPagamento();
 * pix.confirmarPagamento();
 *
 * Saída esperada:
 *
 * Pagamento de R$250,00 confirmado no Cartão de Crédito (Taxa: R$7,50)
 * Boleto de R$500,00 gerado com sucesso (Taxa: R$5,00)
 * Pagamento via Pix de R$300,00 confirmado
 */

package com.github.lucasdevrj.exercicios.sistemadepagamentos;

import java.math.BigDecimal;

public class Principal {
    public static void main(String[] args) {
        CartaoCredito cartaoCredito = new CartaoCredito(new BigDecimal("568.34"));
        BoletoBancario boletoBancario = new BoletoBancario(new BigDecimal("643.45"));
        Pix pix = new Pix(new BigDecimal("400.00"));

        cartaoCredito.confirmarPagamento();
        boletoBancario.confirmarPagamento();
        pix.confirmarPagamento();
    }
}

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

1 resposta

Oi, Lucas. Tudo bem com você?

Obrigado por compartilhar sua resolução. O exercício ficou coerente com a proposta e a utilização da classe abstrata Pagamento em conjunto com a interface Taxa foi uma boa escolha. Dessa forma, você separou a responsabilidade comum dos pagamentos da regra específica de cálculo das taxas, aplicando conceitos de herança, abstração e polimorfismo de maneira adequada. Também foi uma decisão interessante utilizar BigDecimal, já que ele é o tipo mais indicado para representar valores monetários em Java.

As subclasses implementam corretamente seus comportamentos, e o Pix não implementa a interface Taxa, o que faz sentido, já que esse método de pagamento não possui cobrança de taxa. Como dica de evolução, você poderia criar constantes para representar os percentuais das taxas (1% e 3%), evitando valores literais repetidos e facilitando futuras alterações.

Pensando em uma evolução desse sistema, como você organizaria a implementação caso surgisse um novo método de pagamento com taxa variável de acordo com o valor da compra ou com o perfil do cliente?

Parabéns pela resolução e por explorar o uso de interfaces nesse contexto. Continue compartilhando suas implementações. O fórum permanece à disposição para as próximas dúvidas e discussões.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!