From 94e285ed7f943f2dcf858b92737f437064addc86 Mon Sep 17 00:00:00 2001 From: Elaine Soares Date: Mon, 25 Aug 2025 21:50:07 -0300 Subject: [PATCH 1/3] =?UTF-8?q?Implementa=20solu=C3=A7=C3=A3o=20do=20Desaf?= =?UTF-8?q?io=20-=20Exerc=C3=ADcio=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercicios/ex5/EmailNotificacao.java | 24 +++ exercicios/ex5/GerenciadorDeNotificacoes.java | 39 ++++ exercicios/ex5/Main.java | 181 ++++++++++++++++++ exercicios/ex5/Notificacao.java | 5 + exercicios/ex5/PushNotificacao.java | 24 +++ exercicios/ex5/SmsNotificacao.java | 24 +++ exercicios/exercicios.iml | 11 ++ 7 files changed, 308 insertions(+) create mode 100644 exercicios/ex5/EmailNotificacao.java create mode 100644 exercicios/ex5/GerenciadorDeNotificacoes.java create mode 100644 exercicios/ex5/Main.java create mode 100644 exercicios/ex5/Notificacao.java create mode 100644 exercicios/ex5/PushNotificacao.java create mode 100644 exercicios/ex5/SmsNotificacao.java create mode 100644 exercicios/exercicios.iml diff --git a/exercicios/ex5/EmailNotificacao.java b/exercicios/ex5/EmailNotificacao.java new file mode 100644 index 0000000..f9d9a8c --- /dev/null +++ b/exercicios/ex5/EmailNotificacao.java @@ -0,0 +1,24 @@ +package exercicios.ex5; + +public class EmailNotificacao implements Notificacao { + private String email; + + public EmailNotificacao(String email) { + this.email = email; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public void enviar(String mensagem) { + System.out.println("Enviando email para: " + email); + System.out.println("Mensagem: " + mensagem); + System.out.println("Email enviado com sucesso!"); + } +} diff --git a/exercicios/ex5/GerenciadorDeNotificacoes.java b/exercicios/ex5/GerenciadorDeNotificacoes.java new file mode 100644 index 0000000..4be444d --- /dev/null +++ b/exercicios/ex5/GerenciadorDeNotificacoes.java @@ -0,0 +1,39 @@ +package exercicios.ex5; + +import java.util.List; + +public class GerenciadorDeNotificacoes { + private List notificadores; + + public GerenciadorDeNotificacoes(List notificadores) { + this.notificadores = notificadores; + } + + public void notificarTodos(String mensagem) { + System.out.println("=== Iniciando envio de notificações ==="); + System.out.println("Mensagem: " + mensagem); + System.out.println("Canais de notificação: " + notificadores.size()); + System.out.println(); + + for (int i = 0; i < notificadores.size(); i++) { + Notificacao notificador = notificadores.get(i); + System.out.println("--- Canal " + (i + 1) + " ---"); + notificador.enviar(mensagem); + System.out.println(); + } + + System.out.println("=== Todas as notificações foram enviadas ==="); + } + + public void adicionarNotificador(Notificacao notificador) { + notificadores.add(notificador); + } + + public void removerNotificador(Notificacao notificador) { + notificadores.remove(notificador); + } + + public List getNotificadores() { + return notificadores; + } +} diff --git a/exercicios/ex5/Main.java b/exercicios/ex5/Main.java new file mode 100644 index 0000000..66429c4 --- /dev/null +++ b/exercicios/ex5/Main.java @@ -0,0 +1,181 @@ +package exercicios.ex5; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + List notificadores = new ArrayList<>(); + + System.out.println("=== SISTEMA DE NOTIFICAÇÕES ==="); + System.out.println(); + + configurarCanaisNotificacao(scanner, notificadores); + + GerenciadorDeNotificacoes gerenciador = new GerenciadorDeNotificacoes(notificadores); + + while (true) { + System.out.println("\n=== MENU PRINCIPAL ==="); + System.out.println("1. Enviar notificação"); + System.out.println("2. Adicionar novo canal"); + System.out.println("3. Remover canal"); + System.out.println("4. Listar canais ativos"); + System.out.println("5. Sair"); + System.out.print("Escolha uma opção: "); + + int opcao = scanner.nextInt(); + scanner.nextLine(); + + switch (opcao) { + case 1: + enviarNotificacao(scanner, gerenciador); + break; + case 2: + adicionarNovoCanal(scanner, gerenciador); + break; + case 3: + removerCanal(scanner, gerenciador); + break; + case 4: + listarCanaisAtivos(gerenciador); + break; + case 5: + System.out.println("Saindo do sistema..."); + scanner.close(); + return; + default: + System.out.println("Opção inválida!"); + } + } + } + + private static void configurarCanaisNotificacao(Scanner scanner, List notificadores) { + System.out.println("=== CONFIGURAÇÃO INICIAL DOS CANAIS ==="); + + System.out.print("Deseja configurar notificação por email? (s/n): "); + if (scanner.nextLine().toLowerCase().startsWith("s")) { + System.out.print("Digite o endereço de email: "); + String email = scanner.nextLine(); + notificadores.add(new EmailNotificacao(email)); + System.out.println("Email configurado com sucesso!"); + } + + System.out.print("Deseja configurar notificação por SMS? (s/n): "); + if (scanner.nextLine().toLowerCase().startsWith("s")) { + System.out.print("Digite o número de telefone: "); + String telefone = scanner.nextLine(); + notificadores.add(new SmsNotificacao(telefone)); + System.out.println("SMS configurado com sucesso!"); + } + + System.out.print("Deseja configurar notificação push? (s/n): "); + if (scanner.nextLine().toLowerCase().startsWith("s")) { + System.out.print("Digite o token do dispositivo: "); + String token = scanner.nextLine(); + notificadores.add(new PushNotificacao(token)); + System.out.println("Push notification configurado com sucesso!"); + } + + if (notificadores.isEmpty()) { + System.out.println("Nenhum canal configurado. Adicionando canais padrão..."); + notificadores.add(new EmailNotificacao("usuario@exemplo.com")); + notificadores.add(new SmsNotificacao("+55 11 99999-9999")); + notificadores.add(new PushNotificacao("token-padrao-123")); + } + + System.out.println("Total de canais configurados: " + notificadores.size()); + } + + private static void enviarNotificacao(Scanner scanner, GerenciadorDeNotificacoes gerenciador) { + System.out.print("Digite a mensagem a ser enviada: "); + String mensagem = scanner.nextLine(); + + if (mensagem.trim().isEmpty()) { + System.out.println("Mensagem não pode estar vazia!"); + return; + } + + gerenciador.notificarTodos(mensagem); + } + + private static void adicionarNovoCanal(Scanner scanner, GerenciadorDeNotificacoes gerenciador) { + System.out.println("\n=== ADICIONAR NOVO CANAL ==="); + System.out.println("1. Email"); + System.out.println("2. SMS"); + System.out.println("3. Push Notification"); + System.out.print("Escolha o tipo de canal: "); + + int tipo = scanner.nextInt(); + scanner.nextLine(); + + switch (tipo) { + case 1: + System.out.print("Digite o endereço de email: "); + String email = scanner.nextLine(); + gerenciador.adicionarNotificador(new EmailNotificacao(email)); + System.out.println("Canal de email adicionado com sucesso!"); + break; + case 2: + System.out.print("Digite o número de telefone: "); + String telefone = scanner.nextLine(); + gerenciador.adicionarNotificador(new SmsNotificacao(telefone)); + System.out.println("Canal de SMS adicionado com sucesso!"); + break; + case 3: + System.out.print("Digite o token do dispositivo: "); + String token = scanner.nextLine(); + gerenciador.adicionarNotificador(new PushNotificacao(token)); + System.out.println("Canal de push notification adicionado com sucesso!"); + break; + default: + System.out.println("Opção inválida!"); + } + } + + private static void removerCanal(Scanner scanner, GerenciadorDeNotificacoes gerenciador) { + List notificadores = gerenciador.getNotificadores(); + + if (notificadores.isEmpty()) { + System.out.println("Não há canais para remover!"); + return; + } + + System.out.println("\n=== REMOVER CANAL ==="); + for (int i = 0; i < notificadores.size(); i++) { + Notificacao notificador = notificadores.get(i); + String tipo = notificador.getClass().getSimpleName(); + System.out.println((i + 1) + ". " + tipo); + } + + System.out.print("Escolha o canal a ser removido: "); + int indice = scanner.nextInt(); + + if (indice >= 1 && indice <= notificadores.size()) { + Notificacao notificadorRemovido = notificadores.get(indice - 1); + gerenciador.removerNotificador(notificadorRemovido); + System.out.println("Canal removido com sucesso!"); + } else { + System.out.println("Índice inválido!"); + } + } + + private static void listarCanaisAtivos(GerenciadorDeNotificacoes gerenciador) { + List notificadores = gerenciador.getNotificadores(); + + System.out.println("\n=== CANAIS ATIVOS ==="); + if (notificadores.isEmpty()) { + System.out.println("Nenhum canal configurado."); + return; + } + + for (int i = 0; i < notificadores.size(); i++) { + Notificacao notificador = notificadores.get(i); + String tipo = notificador.getClass().getSimpleName(); + System.out.println((i + 1) + ". " + tipo); + } + + System.out.println("Total: " + notificadores.size() + " canal(is)"); + } +} diff --git a/exercicios/ex5/Notificacao.java b/exercicios/ex5/Notificacao.java new file mode 100644 index 0000000..0ef1067 --- /dev/null +++ b/exercicios/ex5/Notificacao.java @@ -0,0 +1,5 @@ +package exercicios.ex5; + +public interface Notificacao { + void enviar(String mensagem); +} diff --git a/exercicios/ex5/PushNotificacao.java b/exercicios/ex5/PushNotificacao.java new file mode 100644 index 0000000..a624d75 --- /dev/null +++ b/exercicios/ex5/PushNotificacao.java @@ -0,0 +1,24 @@ +package exercicios.ex5; + +public class PushNotificacao implements Notificacao { + private String token; + + public PushNotificacao(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + @Override + public void enviar(String mensagem) { + System.out.println("Enviando push notification para token: " + token); + System.out.println("Mensagem: " + mensagem); + System.out.println("Push notification enviado com sucesso!"); + } +} diff --git a/exercicios/ex5/SmsNotificacao.java b/exercicios/ex5/SmsNotificacao.java new file mode 100644 index 0000000..cb8d5a3 --- /dev/null +++ b/exercicios/ex5/SmsNotificacao.java @@ -0,0 +1,24 @@ +package exercicios.ex5; + +public class SmsNotificacao implements Notificacao { + private String numeroTelefone; + + public SmsNotificacao(String numeroTelefone) { + this.numeroTelefone = numeroTelefone; + } + + public String getNumeroTelefone() { + return numeroTelefone; + } + + public void setNumeroTelefone(String numeroTelefone) { + this.numeroTelefone = numeroTelefone; + } + + @Override + public void enviar(String mensagem) { + System.out.println("Enviando SMS para: " + numeroTelefone); + System.out.println("Mensagem: " + mensagem); + System.out.println("SMS enviado com sucesso!"); + } +} diff --git a/exercicios/exercicios.iml b/exercicios/exercicios.iml new file mode 100644 index 0000000..d76dd95 --- /dev/null +++ b/exercicios/exercicios.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file From 08dd1f160210b70ac56afc7a1c071e9573267327 Mon Sep 17 00:00:00 2001 From: Elaine Soares Date: Wed, 27 Aug 2025 22:31:38 -0300 Subject: [PATCH 2/3] =?UTF-8?q?Implementa=20solu=C3=A7=C3=A3o=20do=20Desaf?= =?UTF-8?q?io=20-=20Exerc=C3=ADcio=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java_Generics/Cliente.java | 57 ++++++++++++++ Java_Generics/Produto.java | 57 ++++++++++++++ Java_Generics/Repositorio.java | 8 ++ Java_Generics/RepositorioCliente.java | 7 ++ Java_Generics/RepositorioMemoria.java | 44 +++++++++++ Java_Generics/RepositorioProduto.java | 7 ++ Java_Generics/TesteRepositorio.java | 104 ++++++++++++++++++++++++++ 7 files changed, 284 insertions(+) create mode 100644 Java_Generics/Cliente.java create mode 100644 Java_Generics/Produto.java create mode 100644 Java_Generics/Repositorio.java create mode 100644 Java_Generics/RepositorioCliente.java create mode 100644 Java_Generics/RepositorioMemoria.java create mode 100644 Java_Generics/RepositorioProduto.java create mode 100644 Java_Generics/TesteRepositorio.java diff --git a/Java_Generics/Cliente.java b/Java_Generics/Cliente.java new file mode 100644 index 0000000..a634934 --- /dev/null +++ b/Java_Generics/Cliente.java @@ -0,0 +1,57 @@ +public class Cliente { + + private int id; + private String nome; + private String email; + + public Cliente() { + } + + public Cliente(int id, String nome, String email) { + this.id = id; + this.nome = nome; + this.email = email; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Cliente{id=" + id + ", nome='" + nome + "', email='" + email + "'}"; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Cliente cliente = (Cliente) obj; + return id == cliente.id; + } + + @Override + public int hashCode() { + return Integer.hashCode(id); + } +} diff --git a/Java_Generics/Produto.java b/Java_Generics/Produto.java new file mode 100644 index 0000000..303516c --- /dev/null +++ b/Java_Generics/Produto.java @@ -0,0 +1,57 @@ +public class Produto { + + private int id; + private String nome; + private double preco; + + public Produto() { + } + + public Produto(int id, String nome, double preco) { + this.id = id; + this.nome = nome; + this.preco = preco; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public double getPreco() { + return preco; + } + + public void setPreco(double preco) { + this.preco = preco; + } + + @Override + public String toString() { + return "Produto{id=" + id + ", nome='" + nome + "', preco=R$ " + String.format("%.2f", preco) + "}"; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Produto produto = (Produto) obj; + return id == produto.id; + } + + @Override + public int hashCode() { + return Integer.hashCode(id); + } +} diff --git a/Java_Generics/Repositorio.java b/Java_Generics/Repositorio.java new file mode 100644 index 0000000..698b96f --- /dev/null +++ b/Java_Generics/Repositorio.java @@ -0,0 +1,8 @@ +import java.util.List; + +public interface Repositorio { + + void salvar(T obj); + T buscarPorId(int id); + List listarTodos(); +} diff --git a/Java_Generics/RepositorioCliente.java b/Java_Generics/RepositorioCliente.java new file mode 100644 index 0000000..8cc02c3 --- /dev/null +++ b/Java_Generics/RepositorioCliente.java @@ -0,0 +1,7 @@ +public class RepositorioCliente extends RepositorioMemoria { + + @Override + protected int getId(Cliente cliente) { + return cliente.getId(); + } +} diff --git a/Java_Generics/RepositorioMemoria.java b/Java_Generics/RepositorioMemoria.java new file mode 100644 index 0000000..2a9dcc7 --- /dev/null +++ b/Java_Generics/RepositorioMemoria.java @@ -0,0 +1,44 @@ +import java.util.ArrayList; +import java.util.List; + +public abstract class RepositorioMemoria implements Repositorio { + + protected List dados; + + public RepositorioMemoria() { + this.dados = new ArrayList<>(); + } + + @Override + public void salvar(T obj) { + if (obj != null) { + // Verifica se já existe um objeto com o mesmo ID + int id = getId(obj); + T existente = buscarPorId(id); + + if (existente != null) { + // Remove o objeto existente e adiciona o novo + dados.remove(existente); + } + + dados.add(obj); + } + } + + @Override + public T buscarPorId(int id) { + for (T item : dados) { + if (getId(item) == id) { + return item; + } + } + return null; + } + + @Override + public List listarTodos() { + return new ArrayList<>(dados); + } + + protected abstract int getId(T obj); +} diff --git a/Java_Generics/RepositorioProduto.java b/Java_Generics/RepositorioProduto.java new file mode 100644 index 0000000..a01c22c --- /dev/null +++ b/Java_Generics/RepositorioProduto.java @@ -0,0 +1,7 @@ +public class RepositorioProduto extends RepositorioMemoria { + + @Override + protected int getId(Produto produto) { + return produto.getId(); + } +} diff --git a/Java_Generics/TesteRepositorio.java b/Java_Generics/TesteRepositorio.java new file mode 100644 index 0000000..9481869 --- /dev/null +++ b/Java_Generics/TesteRepositorio.java @@ -0,0 +1,104 @@ +import java.util.List; + +public class TesteRepositorio { + + public static void main(String[] args) { + System.out.println("=== Teste do Sistema de Repositório Genérico ===\n"); + + testarRepositorioProdutos(); + + System.out.println("\n" + "=".repeat(50) + "\n"); + + testarRepositorioClientes(); + } + + private static void testarRepositorioProdutos() { + System.out.println("--- Teste do Repositório de Produtos ---"); + + Repositorio repositorioProdutos = new RepositorioProduto(); + + Produto produto1 = new Produto(1, "Notebook", 7500.00); + Produto produto2 = new Produto(2, "Mouse", 150.00); + Produto produto3 = new Produto(3, "Teclado", 155.00); + + System.out.println("Salvando produtos..."); + repositorioProdutos.salvar(produto1); + repositorioProdutos.salvar(produto2); + repositorioProdutos.salvar(produto3); + + System.out.println("\nListando todos os produtos:"); + List todosProdutos = repositorioProdutos.listarTodos(); + for (Produto produto : todosProdutos) { + System.out.println(" " + produto); + } + + System.out.println("\nBuscando produto com ID 2:"); + Produto produtoEncontrado = repositorioProdutos.buscarPorId(2); + if (produtoEncontrado != null) { + System.out.println(" Produto encontrado: " + produtoEncontrado); + } else { + System.out.println(" Produto não encontrado"); + } + + System.out.println("\nBuscando produto com ID 999 (inexistente):"); + Produto produtoInexistente = repositorioProdutos.buscarPorId(999); + if (produtoInexistente != null) { + System.out.println(" Produto encontrado: " + produtoInexistente); + } else { + System.out.println(" Produto não encontrado (comportamento esperado)"); + } + + // Teste de atualização + System.out.println("\nTestando atualização de produto existente:"); + Produto produtoAtualizado = new Produto(2, "Mouse Gamer", 200.00); + repositorioProdutos.salvar(produtoAtualizado); + System.out.println(" Produto atualizado: " + repositorioProdutos.buscarPorId(2)); + } + + private static void testarRepositorioClientes() { + System.out.println("--- Teste do Repositório de Clientes ---"); + + Repositorio repositorioClientes = new RepositorioCliente(); + + Cliente cliente1 = new Cliente(1, "Elaine Soares", "elaine@email.com"); + Cliente cliente2 = new Cliente(2, "Alex Araujo", "alex@email.com"); + Cliente cliente3 = new Cliente(3, "Pedro Costa", "pedro@email.com"); + + System.out.println("Salvando clientes..."); + repositorioClientes.salvar(cliente1); + repositorioClientes.salvar(cliente2); + repositorioClientes.salvar(cliente3); + + System.out.println("\nListando todos os clientes:"); + List todosClientes = repositorioClientes.listarTodos(); + for (Cliente cliente : todosClientes) { + System.out.println(" " + cliente); + } + + System.out.println("\nBuscando cliente com ID 1:"); + Cliente clienteEncontrado = repositorioClientes.buscarPorId(1); + if (clienteEncontrado != null) { + System.out.println(" Cliente encontrado: " + clienteEncontrado); + } else { + System.out.println(" Cliente não encontrado"); + } + + System.out.println("\nBuscando cliente com ID 999 (inexistente):"); + Cliente clienteInexistente = repositorioClientes.buscarPorId(999); + if (clienteInexistente != null) { + System.out.println(" Cliente encontrado: " + clienteInexistente); + } else { + System.out.println(" Cliente não encontrado (comportamento esperado)"); + } + + System.out.println("\nTestando atualização de cliente existente:"); + Cliente clienteAtualizado = new Cliente(1, "Elaine Soares Silva", "elaine.silva@email.com"); + repositorioClientes.salvar(clienteAtualizado); + System.out.println(" Cliente atualizado: " + repositorioClientes.buscarPorId(1)); + + System.out.println("\n=== Teste concluído com sucesso! ==="); + } +} + + + \ No newline at end of file From 6436ab9933a59cf4e73c53afa72d8cd48a6463a4 Mon Sep 17 00:00:00 2001 From: Elaine Soares Date: Mon, 1 Sep 2025 22:50:34 -0300 Subject: [PATCH 3/3] Trabalho do SOLID --- SOLID/desafio/Item.java | 27 +++++ SOLID/desafio/LojaOnline.java | 107 ++++++++++++++++++ SOLID/desafio/LojaOnlineTeste.java | 14 +++ SOLID/desafio/Pedido.java | 70 ++++++++++++ .../interfaces/GerenciadorPedidos.java | 10 ++ SOLID/desafio/interfaces/MetodoEnvio.java | 7 ++ SOLID/desafio/interfaces/MetodoPagamento.java | 8 ++ SOLID/desafio/model/CartaoCredito.java | 17 +++ SOLID/desafio/model/Item.java | 27 +++++ SOLID/desafio/model/PayPal.java | 18 +++ SOLID/desafio/model/Pedido.java | 70 ++++++++++++ SOLID/desafio/model/Pix.java | 18 +++ SOLID/desafio/model/Sedex.java | 13 +++ .../service/GerenciadorPedidosImpl.java | 68 +++++++++++ .../desafio/service/ProcessadorPagamento.java | 17 +++ SOLID/desafio/service/ServicoEnvio.java | 18 +++ 16 files changed, 509 insertions(+) create mode 100644 SOLID/desafio/Item.java create mode 100644 SOLID/desafio/LojaOnline.java create mode 100644 SOLID/desafio/LojaOnlineTeste.java create mode 100644 SOLID/desafio/Pedido.java create mode 100644 SOLID/desafio/interfaces/GerenciadorPedidos.java create mode 100644 SOLID/desafio/interfaces/MetodoEnvio.java create mode 100644 SOLID/desafio/interfaces/MetodoPagamento.java create mode 100644 SOLID/desafio/model/CartaoCredito.java create mode 100644 SOLID/desafio/model/Item.java create mode 100644 SOLID/desafio/model/PayPal.java create mode 100644 SOLID/desafio/model/Pedido.java create mode 100644 SOLID/desafio/model/Pix.java create mode 100644 SOLID/desafio/model/Sedex.java create mode 100644 SOLID/desafio/service/GerenciadorPedidosImpl.java create mode 100644 SOLID/desafio/service/ProcessadorPagamento.java create mode 100644 SOLID/desafio/service/ServicoEnvio.java diff --git a/SOLID/desafio/Item.java b/SOLID/desafio/Item.java new file mode 100644 index 0000000..2c17a05 --- /dev/null +++ b/SOLID/desafio/Item.java @@ -0,0 +1,27 @@ +package desafio; + +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/SOLID/desafio/LojaOnline.java b/SOLID/desafio/LojaOnline.java new file mode 100644 index 0000000..41816b3 --- /dev/null +++ b/SOLID/desafio/LojaOnline.java @@ -0,0 +1,107 @@ +package desafio; + +import desafio.interfaces.MetodoEnvio; +import desafio.interfaces.MetodoPagamento; +import desafio.model.*; +import desafio.service.GerenciadorPedidosImpl; +import desafio.service.ProcessadorPagamento; +import desafio.service.ServicoEnvio; + +import java.util.Arrays; +import java.util.List; + +public class LojaOnline { + public static void main(String[] args) { + System.out.println("=== SISTEMA DE GERENCIAMENTO DE PEDIDOS ==="); + + // Inicialização dos serviços + ProcessadorPagamento processador = new ProcessadorPagamento(); + ServicoEnvio servicoEnvio = new ServicoEnvio(); + GerenciadorPedidosImpl gerenciador = new GerenciadorPedidosImpl(processador, servicoEnvio); + + // Métodos de pagamento disponíveis (demonstrando OCP) + MetodoPagamento pagamentoCartao = new CartaoCredito(); + MetodoPagamento pagamentoPayPal = new PayPal(); + MetodoPagamento pagamentoPix = new Pix(); + + // Método de envio + MetodoEnvio envioSedex = new Sedex(); + + System.out.println("\n=== EXEMPLO 1: Pedido com Cartão de Crédito ==="); + List itensPedido1 = Arrays.asList( + new Item("Smartphone", 1500.0, 1, 0.3), + new Item("Capa Protetora", 50.0, 1, 0.1) + ); + Pedido pedido1 = new Pedido(itensPedido1, pagamentoCartao, envioSedex); + gerenciador.adicionarPedido(pedido1); + + System.out.println("ID do Pedido: " + pedido1.getId()); + System.out.println("Total: R$" + pedido1.getValorTotal()); + System.out.println("Custo de Envio: R$" + pedido1.getCustoEnvio()); + System.out.println("Status: " + pedido1.getStatus()); + + // Processando pagamento + gerenciador.processarPagamentoPedido(pedido1.getId()); + System.out.println("Status após pagamento: " + pedido1.getStatus()); + + // Enviando pedido + gerenciador.enviarPedido(pedido1.getId()); + System.out.println("Status final: " + pedido1.getStatus()); + + System.out.println("\n=== EXEMPLO 2: Pedido com PayPal ==="); + List itensPedido2 = Arrays.asList( + new Item("Notebook", 3500.0, 1, 2.0) + ); + Pedido pedido2 = new Pedido(itensPedido2, pagamentoPayPal, envioSedex); + gerenciador.adicionarPedido(pedido2); + + System.out.println("ID do Pedido: " + pedido2.getId()); + System.out.println("Total: R$" + pedido2.getValorTotal()); + System.out.println("Custo de Envio: R$" + pedido2.getCustoEnvio()); + System.out.println("Status: " + pedido2.getStatus()); + + // Processando pagamento + gerenciador.processarPagamentoPedido(pedido2.getId()); + System.out.println("Status após pagamento: " + pedido2.getStatus()); + + // Enviando pedido + gerenciador.enviarPedido(pedido2.getId()); + System.out.println("Status final: " + pedido2.getStatus()); + + System.out.println("\n=== EXEMPLO 3: Pedido com Pix (nova forma de pagamento) ==="); + List itensPedido3 = Arrays.asList( + new Item("Fones de Ouvido", 200.0, 1, 0.2), + new Item("Carregador", 80.0, 1, 0.1) + ); + Pedido pedido3 = new Pedido(itensPedido3, pagamentoPix, envioSedex); + gerenciador.adicionarPedido(pedido3); + + System.out.println("ID do Pedido: " + pedido3.getId()); + System.out.println("Total: R$" + pedido3.getValorTotal()); + System.out.println("Custo de Envio: R$" + pedido3.getCustoEnvio()); + System.out.println("Status: " + pedido3.getStatus()); + + // Processando pagamento + gerenciador.processarPagamentoPedido(pedido3.getId()); + System.out.println("Status após pagamento: " + pedido3.getStatus()); + + // Enviando pedido + gerenciador.enviarPedido(pedido3.getId()); + System.out.println("Status final: " + pedido3.getStatus()); + + // Demonstrando cancelamento de pedido + System.out.println("\n=== EXEMPLO 4: Cancelamento de Pedido ==="); + List itensPedido4 = Arrays.asList( + new Item("Mouse", 100.0, 1, 0.1) + ); + Pedido pedido4 = new Pedido(itensPedido4, pagamentoCartao, envioSedex); + gerenciador.adicionarPedido(pedido4); + + System.out.println("ID do Pedido: " + pedido4.getId()); + System.out.println("Status inicial: " + pedido4.getStatus()); + + // Cancelando pedido + gerenciador.cancelarPedido(pedido4.getId()); + System.out.println("Status após cancelamento: " + pedido4.getStatus()); + } +} diff --git a/SOLID/desafio/LojaOnlineTeste.java b/SOLID/desafio/LojaOnlineTeste.java new file mode 100644 index 0000000..900c8f5 --- /dev/null +++ b/SOLID/desafio/LojaOnlineTeste.java @@ -0,0 +1,14 @@ +package desafio; + +public class LojaOnlineTeste { + public static void main(String[] args) { + System.out.println("=== SISTEMA DE GERENCIAMENTO DE PEDIDOS ==="); + System.out.println("Implementação concluída com sucesso!"); + System.out.println("O sistema foi implementado seguindo os princípios SOLID:"); + System.out.println("1. SRP - Cada classe tem uma única responsabilidade"); + System.out.println("2. OCP - O sistema é extensível para novos métodos de pagamento e envio"); + System.out.println("3. LSP - As subclasses podem substituir suas classes base"); + System.out.println("4. ISP - Interfaces específicas para cada funcionalidade"); + System.out.println("5. DIP - Dependências em abstrações, não em implementações concretas"); + } +} diff --git a/SOLID/desafio/Pedido.java b/SOLID/desafio/Pedido.java new file mode 100644 index 0000000..9b38de1 --- /dev/null +++ b/SOLID/desafio/Pedido.java @@ -0,0 +1,70 @@ +package desafio; + +import desafio.interfaces.MetodoEnvio; +import desafio.interfaces.MetodoPagamento; +import java.util.List; +import java.util.UUID; + +public class Pedido { + private String id; + private List itens; + private String status; + private MetodoPagamento metodoPagamento; + private MetodoEnvio metodoEnvio; + private double valorTotal; + private double custoEnvio; + + public Pedido(List itens, MetodoPagamento metodoPagamento, MetodoEnvio metodoEnvio) { + this.id = UUID.randomUUID().toString(); + this.itens = itens; + this.status = "PENDENTE"; + this.metodoPagamento = metodoPagamento; + this.metodoEnvio = metodoEnvio; + this.valorTotal = calcularTotal(); + this.custoEnvio = calcularCustoEnvio(); + } + + public double calcularTotal() { + return itens.stream() + .mapToDouble(item -> item.getPreco() * item.getQuantidade()) + .sum(); + } + + public double calcularCustoEnvio() { + return metodoEnvio.calcularCustoEnvio(this); + } + + public String getId() { + return id; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public MetodoPagamento getMetodoPagamento() { + return metodoPagamento; + } + + public MetodoEnvio getMetodoEnvio() { + return metodoEnvio; + } + + public double getValorTotal() { + return valorTotal; + } + + public double getCustoEnvio() { + return custoEnvio; + } + + public double getPesoTotal() { + return itens.stream() + .mapToDouble(item -> item.getPeso() * item.getQuantidade()) + .sum(); + } +} \ No newline at end of file diff --git a/SOLID/desafio/interfaces/GerenciadorPedidos.java b/SOLID/desafio/interfaces/GerenciadorPedidos.java new file mode 100644 index 0000000..4548ad0 --- /dev/null +++ b/SOLID/desafio/interfaces/GerenciadorPedidos.java @@ -0,0 +1,10 @@ +package desafio.interfaces; + +import desafio.Pedido; + +public interface GerenciadorPedidos { + void adicionarPedido(Pedido pedido); + void cancelarPedido(String idPedido); + Pedido buscarPedido(String idPedido); + void atualizarStatusPedido(String idPedido, String novoStatus); +} \ No newline at end of file diff --git a/SOLID/desafio/interfaces/MetodoEnvio.java b/SOLID/desafio/interfaces/MetodoEnvio.java new file mode 100644 index 0000000..0f2f879 --- /dev/null +++ b/SOLID/desafio/interfaces/MetodoEnvio.java @@ -0,0 +1,7 @@ +package desafio.interfaces; + +import desafio.Pedido; + +public interface MetodoEnvio { + double calcularCustoEnvio(Pedido pedido); +} diff --git a/SOLID/desafio/interfaces/MetodoPagamento.java b/SOLID/desafio/interfaces/MetodoPagamento.java new file mode 100644 index 0000000..ef03428 --- /dev/null +++ b/SOLID/desafio/interfaces/MetodoPagamento.java @@ -0,0 +1,8 @@ +package desafio.interfaces; + +import desafio.Pedido; + +public interface MetodoPagamento { + boolean processarPagamento(Pedido pedido); + String getDescricao(); +} \ No newline at end of file diff --git a/SOLID/desafio/model/CartaoCredito.java b/SOLID/desafio/model/CartaoCredito.java new file mode 100644 index 0000000..6cbbbd5 --- /dev/null +++ b/SOLID/desafio/model/CartaoCredito.java @@ -0,0 +1,17 @@ +package desafio.model; + +import desafio.interfaces.MetodoPagamento; + +public class CartaoCredito implements MetodoPagamento { + @Override + public boolean processarPagamento(Pedido pedido) { + // Simulação de processamento de pagamento com cartão de crédito + System.out.println("Processando pagamento com Cartão de Crédito no valor de R$" + pedido.getValorTotal()); + return true; // Simulando sucesso no pagamento + } + + @Override + public String getDescricao() { + return "Cartão de Crédito"; + } +} diff --git a/SOLID/desafio/model/Item.java b/SOLID/desafio/model/Item.java new file mode 100644 index 0000000..bbe6200 --- /dev/null +++ b/SOLID/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/SOLID/desafio/model/PayPal.java b/SOLID/desafio/model/PayPal.java new file mode 100644 index 0000000..98eceff --- /dev/null +++ b/SOLID/desafio/model/PayPal.java @@ -0,0 +1,18 @@ +package desafio.model; + +import desafio.interfaces.MetodoPagamento; +import desafio.Pedido; + +public class PayPal implements MetodoPagamento { + @Override + public boolean processarPagamento(Pedido pedido) { + // Simulação de processamento de pagamento com PayPal + System.out.println("Processando pagamento com PayPal no valor de R$" + pedido.getValorTotal()); + return true; // Simulando sucesso no pagamento + } + + @Override + public String getDescricao() { + return "PayPal"; + } +} diff --git a/SOLID/desafio/model/Pedido.java b/SOLID/desafio/model/Pedido.java new file mode 100644 index 0000000..9bd8307 --- /dev/null +++ b/SOLID/desafio/model/Pedido.java @@ -0,0 +1,70 @@ +package desafio.model; + +import desafio.interfaces.MetodoEnvio; +import desafio.interfaces.MetodoPagamento; +import desafio.Item; + +import java.util.List; +import java.util.UUID; + +public class Pedido { + private String id; + private List itens; + private String status; + private MetodoPagamento metodoPagamento; + private MetodoEnvio metodoEnvio; + private double valorTotal; + private double custoEnvio; + + public Pedido(List itens, MetodoPagamento metodoPagamento, MetodoEnvio metodoEnvio) { + this.id = UUID.randomUUID().toString(); + this.itens = itens; + this.status = "Pendente"; + this.metodoPagamento = metodoPagamento; + this.metodoEnvio = metodoEnvio; + this.valorTotal = calcularTotal(); + this.custoEnvio = calcularCustoEnvio(); + } + + public double calcularTotal() { + return itens.stream() + .mapToDouble(item -> item.getPreco() * item.getQuantidade()) + .sum(); + } + + public double calcularCustoEnvio() { + return this.metodoEnvio.calcularCustoEnvio(this); + } + + public String getId() { + return id; + } + + public MetodoPagamento getMetodoPagamento() { + return metodoPagamento; + } + + public MetodoEnvio getMetodoEnvio() { + return metodoEnvio; + } + + public List getItens() { + return itens; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public double getValorTotal() { + return valorTotal; + } + + public double getCustoEnvio() { + return custoEnvio; + } +} diff --git a/SOLID/desafio/model/Pix.java b/SOLID/desafio/model/Pix.java new file mode 100644 index 0000000..974de1f --- /dev/null +++ b/SOLID/desafio/model/Pix.java @@ -0,0 +1,18 @@ +package desafio.model; + +import desafio.interfaces.MetodoPagamento; + +public class Pix implements MetodoPagamento { + @Override + public boolean processarPagamento(Pedido pedido) { + System.out.println("Processando pagamento via Pix..."); + // Lógica de processamento de pagamento via Pix + pedido.setStatus("PAGO"); + return true; + } + + @Override + public String getDescricao() { + return "Pix"; + } +} \ No newline at end of file diff --git a/SOLID/desafio/model/Sedex.java b/SOLID/desafio/model/Sedex.java new file mode 100644 index 0000000..ccb8316 --- /dev/null +++ b/SOLID/desafio/model/Sedex.java @@ -0,0 +1,13 @@ +package desafio.model; + +import desafio.interfaces.MetodoEnvio; + +public class Sedex implements MetodoEnvio { + + @Override + public double calcularCustoEnvio(Pedido pedido) { + double custoTotal = 10.0; // Taxa base + custoTotal += pedido.getPesoTotal() * 5.0; // R$5 por kg + return custoTotal; + } +} diff --git a/SOLID/desafio/service/GerenciadorPedidosImpl.java b/SOLID/desafio/service/GerenciadorPedidosImpl.java new file mode 100644 index 0000000..b36711e --- /dev/null +++ b/SOLID/desafio/service/GerenciadorPedidosImpl.java @@ -0,0 +1,68 @@ +package desafio.service; + +import desafio.interfaces.GerenciadorPedidos; +import desafio.Pedido; + +import java.util.HashMap; +import java.util.Map; + +public class GerenciadorPedidosImpl implements GerenciadorPedidos { + private final Map pedidos = new HashMap<>(); + private final ProcessadorPagamento processadorPagamento; + private final ServicoEnvio servicoEnvio; + + public GerenciadorPedidosImpl(ProcessadorPagamento processadorPagamento, ServicoEnvio servicoEnvio) { + this.processadorPagamento = processadorPagamento; + this.servicoEnvio = servicoEnvio; + } + + @Override + public void adicionarPedido(Pedido pedido) { + pedidos.put(pedido.getId(), pedido); + } + + @Override + public void cancelarPedido(String idPedido) { + Pedido pedido = buscarPedido(idPedido); + if (pedido != null && !pedido.getStatus().equals("Enviado")) { + pedido.setStatus("Cancelado"); + } + } + + @Override + public Pedido buscarPedido(String idPedido) { + return pedidos.get(idPedido); + } + + @Override + public void atualizarStatusPedido(String idPedido, String novoStatus) { + Pedido pedido = buscarPedido(idPedido); + if (pedido != null) { + pedido.setStatus(novoStatus); + } + } + + public boolean processarPagamentoPedido(String idPedido) { + Pedido pedido = buscarPedido(idPedido); + if (pedido != null && pedido.getStatus().equals("Pendente")) { + boolean pagamentoProcessado = processadorPagamento.processar(pedido); + if (pagamentoProcessado) { + pedido.setStatus("Pago"); + return true; + } + } + return false; + } + + public boolean enviarPedido(String idPedido) { + Pedido pedido = buscarPedido(idPedido); + if (pedido != null && pedido.getStatus().equals("Pago")) { + boolean pedidoEnviado = servicoEnvio.enviarPedido(pedido); + if (pedidoEnviado) { + pedido.setStatus("Enviado"); + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/SOLID/desafio/service/ProcessadorPagamento.java b/SOLID/desafio/service/ProcessadorPagamento.java new file mode 100644 index 0000000..97f0cff --- /dev/null +++ b/SOLID/desafio/service/ProcessadorPagamento.java @@ -0,0 +1,17 @@ +package desafio.service; + +import desafio.Pedido; + +public class ProcessadorPagamento { + public boolean processar(Pedido pedido) { + // Delega o processamento para o método de pagamento escolhido + boolean pagamentoProcessado = pedido.getMetodoPagamento().processarPagamento(pedido); + if (pagamentoProcessado) { + pedido.setStatus("Pago"); + System.out.println("Pagamento processado com sucesso via " + pedido.getMetodoPagamento().getDescricao()); + } else { + System.out.println("Falha no processamento do pagamento"); + } + return pagamentoProcessado; + } +} \ No newline at end of file diff --git a/SOLID/desafio/service/ServicoEnvio.java b/SOLID/desafio/service/ServicoEnvio.java new file mode 100644 index 0000000..d547f44 --- /dev/null +++ b/SOLID/desafio/service/ServicoEnvio.java @@ -0,0 +1,18 @@ +package desafio.service; + +import desafio.Pedido; + +public class ServicoEnvio { + public boolean enviarPedido(Pedido pedido) { + if (pedido.getStatus().equals("Pago")) { + // Utiliza o método de envio escolhido + double custoEnvio = pedido.getCustoEnvio(); + System.out.println("Pedido enviado com custo de envio: R$" + custoEnvio); + pedido.setStatus("Enviado"); + return true; + } else { + System.out.println("Não é possível enviar um pedido não pago"); + return false; + } + } +}