From 8a8bfa60824659862be70ccf249e933523620dae Mon Sep 17 00:00:00 2001 From: Pedro Athayde Date: Fri, 29 Aug 2025 14:59:49 -0300 Subject: [PATCH] feat: add desafio solid --- src/exemplo/desafio/LojaOnline.java | 55 +++++++++++++++++++ .../desafio/interfaces/MetodoEnvio.java | 7 +++ .../desafio/interfaces/MetodoPagamento.java | 5 ++ src/exemplo/desafio/model/CartaoCredito.java | 11 ++++ src/exemplo/desafio/model/Item.java | 27 +++++++++ src/exemplo/desafio/model/PayPal.java | 11 ++++ src/exemplo/desafio/model/Pedido.java | 46 ++++++++++++++++ src/exemplo/desafio/model/Sedex.java | 16 ++++++ .../desafio/service/ProcessadorPagamento.java | 17 ++++++ src/exemplo/desafio/service/ServicoEnvio.java | 15 +++++ 10 files changed, 210 insertions(+) create mode 100644 src/exemplo/desafio/LojaOnline.java create mode 100644 src/exemplo/desafio/interfaces/MetodoEnvio.java create mode 100644 src/exemplo/desafio/interfaces/MetodoPagamento.java create mode 100644 src/exemplo/desafio/model/CartaoCredito.java create mode 100644 src/exemplo/desafio/model/Item.java create mode 100644 src/exemplo/desafio/model/PayPal.java create mode 100644 src/exemplo/desafio/model/Pedido.java create mode 100644 src/exemplo/desafio/model/Sedex.java create mode 100644 src/exemplo/desafio/service/ProcessadorPagamento.java create mode 100644 src/exemplo/desafio/service/ServicoEnvio.java diff --git a/src/exemplo/desafio/LojaOnline.java b/src/exemplo/desafio/LojaOnline.java new file mode 100644 index 0000000..fba13c0 --- /dev/null +++ b/src/exemplo/desafio/LojaOnline.java @@ -0,0 +1,55 @@ +package exemplo.desafio; + +import exemplo.desafio.interfaces.MetodoEnvio; +import exemplo.desafio.interfaces.MetodoPagamento; +import exemplo.desafio.model.*; +import exemplo.desafio.service.ProcessadorPagamento; +import exemplo.desafio.service.ServicoEnvio; + +import java.util.Arrays; +import java.util.List; + +public class LojaOnline { + public static void main(String[] args) { + // Serviços + ProcessadorPagamento processador = new ProcessadorPagamento(); + ServicoEnvio servicoEnvio = new ServicoEnvio(); + + // Estrategias + MetodoPagamento pagamentoCartao = new CartaoCredito(); + MetodoPagamento pagamentoPayPal = new PayPal(); + MetodoEnvio envioSedex = new Sedex(); + + // Pedido 1 : Pago com Cartao de Credito + List itensPedido1 = Arrays.asList( + new Item("Produto A", 50.0, 2, 0.5), + new Item("Produto B", 30.0, 1, 0.2) + ); + Pedido pedido1 = new Pedido(itensPedido1, pagamentoCartao, envioSedex); + + System.out.printf("Total do pedido 1: R$%.2f%n", pedido1.calcularTotal()); + System.out.println("Status inicial: " + pedido1.getStatus()); + + processador.processar(pedido1); + System.out.println("Status após pagamento: " + pedido1.getStatus()); + + servicoEnvio.enviarPedido(pedido1); + System.out.println("Status final: " + pedido1.getStatus()); + + System.out.println("\n" + "=".repeat(30) + "\n"); + + List itensPedido2 = Arrays.asList( + new Item("Produto C", 120.0, 1, 1.2) + ); + Pedido pedido2 = new Pedido(itensPedido2, pagamentoPayPal, envioSedex); + + System.out.printf("Total do pedido 2: R$%.2f%n", pedido2.calcularTotal()); + System.out.println("Status inicial: " + pedido2.getStatus()); + + processador.processar(pedido2); + System.out.println("Status apos pagamento: " + pedido2.getStatus()); + + servicoEnvio.enviarPedido(pedido2); + System.out.println("Status final: " + pedido2.getStatus()); + } +} diff --git a/src/exemplo/desafio/interfaces/MetodoEnvio.java b/src/exemplo/desafio/interfaces/MetodoEnvio.java new file mode 100644 index 0000000..97f2702 --- /dev/null +++ b/src/exemplo/desafio/interfaces/MetodoEnvio.java @@ -0,0 +1,7 @@ +package exemplo.desafio.interfaces; + +import exemplo.desafio.model.Pedido; + +public interface MetodoEnvio { + double calcularCustoEnvio(Pedido pedido); +} diff --git a/src/exemplo/desafio/interfaces/MetodoPagamento.java b/src/exemplo/desafio/interfaces/MetodoPagamento.java new file mode 100644 index 0000000..77ddfe1 --- /dev/null +++ b/src/exemplo/desafio/interfaces/MetodoPagamento.java @@ -0,0 +1,5 @@ +package exemplo.desafio.interfaces; + +public interface MetodoPagamento { + boolean processarPagamento(double valor); +} \ No newline at end of file diff --git a/src/exemplo/desafio/model/CartaoCredito.java b/src/exemplo/desafio/model/CartaoCredito.java new file mode 100644 index 0000000..4d26895 --- /dev/null +++ b/src/exemplo/desafio/model/CartaoCredito.java @@ -0,0 +1,11 @@ +package exemplo.desafio.model; + +import exemplo.desafio.interfaces.MetodoPagamento; + +public class CartaoCredito implements MetodoPagamento { + @Override + public boolean processarPagamento(double valor) { + System.out.printf("Processando R$%.2f com Cartão de Crédito.%n", valor); + return true; + } +} diff --git a/src/exemplo/desafio/model/Item.java b/src/exemplo/desafio/model/Item.java new file mode 100644 index 0000000..bbe6200 --- /dev/null +++ b/src/exemplo/desafio/model/Item.java @@ -0,0 +1,27 @@ +package exemplo.desafio.model; + +public class Item { + private String nome; + private double preco; + private int quantidade; + private double peso; + + public Item(String nome, double preco, int quantidade, double peso) { + this.nome = nome; + this.preco = preco; + this.quantidade = quantidade; + this.peso = peso; + } + + public double getPreco() { + return preco; + } + + public int getQuantidade() { + return quantidade; + } + + public double getPeso() { + return peso; + } +} \ No newline at end of file diff --git a/src/exemplo/desafio/model/PayPal.java b/src/exemplo/desafio/model/PayPal.java new file mode 100644 index 0000000..b6d5598 --- /dev/null +++ b/src/exemplo/desafio/model/PayPal.java @@ -0,0 +1,11 @@ +package exemplo.desafio.model; + +import exemplo.desafio.interfaces.MetodoPagamento; + +public class PayPal implements MetodoPagamento { + @Override + public boolean processarPagamento(double valor) { + System.out.printf("Processando R$%.2f com PayPal.%n", valor); + return true; + } +} diff --git a/src/exemplo/desafio/model/Pedido.java b/src/exemplo/desafio/model/Pedido.java new file mode 100644 index 0000000..841695c --- /dev/null +++ b/src/exemplo/desafio/model/Pedido.java @@ -0,0 +1,46 @@ +package exemplo.desafio.model; + +import exemplo.desafio.interfaces.MetodoEnvio; +import exemplo.desafio.interfaces.MetodoPagamento; + +import java.util.List; + +public class Pedido { + private List itens; + private String status; + private MetodoPagamento metodoPagamento; + private MetodoEnvio metodoEnvio; + + public Pedido(List itens, MetodoPagamento metodoPagamento, MetodoEnvio metodoEnvio) { + this.itens = itens; + this.status = "Pendente"; + this.metodoPagamento = metodoPagamento; + this.metodoEnvio = metodoEnvio; + } + + public double calcularTotal() { + return itens.stream() + .mapToDouble(item -> item.getPreco() * item.getQuantidade()) + .sum(); + } + + public double calcularCustoEnvio() { + return this.metodoEnvio.calcularCustoEnvio(this); + } + + public MetodoPagamento getMetodoPagamento() { + return metodoPagamento; + } + + public List getItens() { + return itens; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/src/exemplo/desafio/model/Sedex.java b/src/exemplo/desafio/model/Sedex.java new file mode 100644 index 0000000..293cd9b --- /dev/null +++ b/src/exemplo/desafio/model/Sedex.java @@ -0,0 +1,16 @@ +package exemplo.desafio.model; + +import exemplo.desafio.interfaces.MetodoEnvio; + +public class Sedex implements MetodoEnvio { + + @Override + public double calcularCustoEnvio(Pedido pedido) { + double pesoTotal = 0; + for (Item item : pedido.getItens()) { + pesoTotal += item.getPeso() * item.getQuantidade(); + } + // Exemplo simples de cálculo de frete + return pesoTotal * 2.5; + } +} diff --git a/src/exemplo/desafio/service/ProcessadorPagamento.java b/src/exemplo/desafio/service/ProcessadorPagamento.java new file mode 100644 index 0000000..314f486 --- /dev/null +++ b/src/exemplo/desafio/service/ProcessadorPagamento.java @@ -0,0 +1,17 @@ +package exemplo.desafio.service; + +import exemplo.desafio.model.Pedido; + +public class ProcessadorPagamento { + public void processar(Pedido pedido) { + double total = pedido.calcularTotal(); + boolean sucesso = pedido.getMetodoPagamento().processarPagamento(total); + if (sucesso) { + pedido.setStatus("Pago"); + System.out.println("Pagamento aprovado."); + } else { + pedido.setStatus("Falha no Pagamento"); + System.out.println("Pagamento recusado."); + } + } +} \ No newline at end of file diff --git a/src/exemplo/desafio/service/ServicoEnvio.java b/src/exemplo/desafio/service/ServicoEnvio.java new file mode 100644 index 0000000..ac615bc --- /dev/null +++ b/src/exemplo/desafio/service/ServicoEnvio.java @@ -0,0 +1,15 @@ +package exemplo.desafio.service; + +import exemplo.desafio.model.Pedido; + +public class ServicoEnvio { + public void enviarPedido(Pedido pedido) { + if ("Pago".equals(pedido.getStatus())) { + double custoEnvio = pedido.calcularCustoEnvio(); + System.out.printf("Pedido enviado. Custo do envio: R$%.2f%n", custoEnvio); + pedido.setStatus("Enviado"); + } else { + System.out.println("Não é possível enviar o pedido antes do pagamento."); + } + } +}