diff --git a/README.md b/README.md index 54c8d80..a9efaa9 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,36 @@ -# 📘 Lista de Exercícios Desafios – Interfaces em Java -Este material contém apenas os **enunciados dos exercícios** para prática. +# Lista de Exercícios - Princípios SOLID em Java ---- - -### **1. Criando uma Interface Simples** -Crie uma interface `Animal` com os métodos `emitirSom()` e `mover()`. -Depois, implemente-a nas classes `Cachorro` e `Gato`. -No programa principal, crie objetos das duas classes e invoque seus métodos. +## Exercício 1 - SRP (Single Responsibility Principle) +Implemente uma classe `Relatorio` que atualmente gera relatórios e também envia emails. Reestruture essa classe aplicando o princípio da responsabilidade única. --- -### **2. Interface com Constantes** -Crie uma interface `OperacoesMatematicas` que define constantes para `PI` e `E`, -além dos métodos `somar`, `subtrair`, `multiplicar` e `dividir`. -Implemente essa interface na classe `Calculadora`. +## Exercício 2 - OCP (Open/Closed Principle) +Implemente um sistema de cálculo de desconto para uma loja, inicialmente com desconto fixo. Em seguida, adapte o sistema para que possa receber novos tipos de desconto sem modificar a lógica já existente. --- -### **3. Interface com `default` e `static`** -Crie uma interface `Pagamento` com o método `processarPagamento(double valor)`. -- Adicione um método `default gerarRecibo(double valor)` que imprime um recibo. -- Adicione um método `static validarValor(double valor)` que verifica se o valor é positivo. -Implemente em `CartaoCredito` e `Pix`. +## Exercício 3 - LSP (Liskov Substitution Principle) +Implemente uma classe `Quadrado` que herda de `Retangulo`. Mostre problemas que podem surgir e reestruture o código para estar em conformidade com o LSP. --- -### **4. Polimorfismo com Interfaces** -Implemente um sistema de gerenciamento de arquivos com uma interface `Armazenamento` que define os métodos `salvar(String dado)` e `ler()`. -Crie implementações para: -- `BancoDeDados` (simula armazenamento em BD) -- `ArquivoTexto` (simula gravação em arquivo de texto) - -No programa principal, crie uma lista de `Armazenamento` e demonstre polimorfismo. +## Exercício 4 - ISP (Interface Segregation Principle) +Implemente uma interface `Trabalhador` com métodos `trabalhar()` e `estudar()`. Mostre como aplicar o ISP criando interfaces mais coesas. --- -### **5. Sistema de Notificações** -Desenvolva um sistema de notificações com os seguintes requisitos: -1. Crie uma interface `Notificacao` com o método `enviar(String mensagem)`. -2. Implemente pelo menos três classes que representem canais de notificação: - - `EmailNotificacao` - - `SmsNotificacao` - - `PushNotificacao` -3. Crie uma classe `GerenciadorDeNotificacoes` que receba uma lista de notificadores (injeção de dependência) e tenha um método `notificarTodos(String mensagem)`. -4. No programa principal (`main`), permita que o usuário escolha quais canais de notificação deseja utilizar. -5. O sistema deve permitir expansão futura (exemplo: adicionar `WhatsAppNotificacao` sem modificar o código existente). +## Exercício 5 - DIP (Dependency Inversion Principle) +Implemente um sistema de notificação que envia mensagens via `EmailService`. Refatore o código para que a classe `Notificador` dependa de abstrações e não de implementações concretas. --- -✍️ Resolva os desafios implementando as classes e interfaces solicitadas. +## Exercício 6 - Desafio Final +Implemente um sistema de **Gerenciamento de Pedidos de uma Loja Online**, aplicando todos os princípios do SOLID: + +- SRP: separar responsabilidades de classes de pedido, pagamento e envio. +- OCP: permitir a adição de novos métodos de pagamento sem alterar código existente. +- LSP: garantir que substituições de classes funcionem sem quebrar o sistema. +- ISP: dividir interfaces em contratos menores e específicos. +- DIP: depender de abstrações em vez de implementações concretas. diff --git a/src/Main.java b/src/Main.java index fb31f50..52f271a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,54 +1,39 @@ -import exemplo.ecommerce.Produto; -import exemplo.imposto.ICMS; -import exemplo.imposto.IOF; -import exemplo.imposto.Imposto; -import exemplo.imposto.ImpostoRecord; - -import java.math.BigDecimal; -import java.util.*; +import desafio6solid.*; public class Main { public static void main(String[] args) { + System.out.println("=== SISTEMA SIMPLIFICADO DE PEDIDOS ===\n"); - //Perecivel produto = new Produto(); - //processar(produto); - - //ICMS, IOF - - Imposto IOF = new IOF(1.5D); - Imposto ICMS = new ICMS(2.7D); - - //new IVA(27D); - - //calcular(IOF); - calcular(ICMS); - //calcular(IVA); + // Criar pedido + Order order = new Order("ORD-001", "joao@email.com", 150.50); - ImpostoRecord iva = new ImpostoRecord("2", "IVA"); - //iva.taxa(); + - Comparator compImposto = Comparator.comparing(Produto::getId) - .thenComparing(Produto::getValor); - //compImposto.compare(new Produto(), new Produto()); + // Caso 1: Cartão + Correios + Email + System.out.println("1. Pagamento com cartão + Correios + Email:"); + Payment cardPayment = new CreditCardPayment("1234567812345678"); + Shipping correios = new CorreiosShipping(); + Notification email = new EmailNotification(); - Integer numero = Integer.valueOf(10); - System.out.printf("O numeros sao iguais %d", numero.compareTo(Integer.valueOf(15))); + OrderProcessor processor1 = new OrderProcessor(cardPayment, correios, email); + processor1.process(order); + System.out.println(); + // Caso 2: PIX + Expresso + SMS (novos métodos sem alterar código existente) + System.out.println("2. Pagamento com PIX + Expresso + SMS:"); + Payment pixPayment = new PixPayment("123.456.789-00"); + Shipping express = new ExpressShipping(); + Notification sms = new SMSNotification(); + OrderProcessor processor2 = new OrderProcessor(pixPayment, express, sms); + processor2.process(order); + System.out.println(); - List produtos = new ArrayList<>(); - produtos.add(new Produto(2, "TV 55", new BigDecimal(4500))); - produtos.add(new Produto(1, "PS 5", new BigDecimal(3800))); - Collections.sort(produtos); - Collections.sort(produtos, Comparator.comparing(Produto::getValor)); - produtos.sort((p1, p2) -> p1.getId().compareTo(p2.getId())); - - - } - - public static void calcular(Imposto imposto) { - imposto.imprimir(); + // Caso 3: Mix de implementações + System.out.println("3. Pagamento com cartão + Expresso + SMS:"); + OrderProcessor processor3 = new OrderProcessor(cardPayment, express, sms); + processor3.process(order); } } \ No newline at end of file diff --git a/src/desafio6solid/CorreioShipping.java b/src/desafio6solid/CorreioShipping.java new file mode 100644 index 0000000..26e956e --- /dev/null +++ b/src/desafio6solid/CorreioShipping.java @@ -0,0 +1,8 @@ +package desafio6solid; + +public class CorreiosShipping implements Shipping { + @Override + public void shipOrder(String orderId) { + System.out.println("Enviando pedido " + orderId + " pelos Correios"); + } +} \ No newline at end of file diff --git a/src/desafio6solid/CreditCardPayment.java b/src/desafio6solid/CreditCardPayment.java new file mode 100644 index 0000000..88f6dcf --- /dev/null +++ b/src/desafio6solid/CreditCardPayment.java @@ -0,0 +1,15 @@ +package desafio6solid; + +public class CreditCardPayment implements Payment { + private String cardNumber; + + public CreditCardPayment(String cardNumber) { + this.cardNumber = cardNumber; + } + + @Override + public boolean pay(double amount) { + System.out.println("Pagando R$" + amount + " com cartão: ****" + cardNumber.substring(cardNumber.length() - 4)); + return true; + } +} \ No newline at end of file diff --git a/src/desafio6solid/EmailNotification.java b/src/desafio6solid/EmailNotification.java new file mode 100644 index 0000000..14e5a7f --- /dev/null +++ b/src/desafio6solid/EmailNotification.java @@ -0,0 +1,8 @@ +package desafio6solid; + +public class EmailNotification implements Notification { + @Override + public void send(String message, String customer) { + System.out.println("Email para " + customer + ": " + message); + } +} diff --git a/src/desafio6solid/ExpressShipping.java b/src/desafio6solid/ExpressShipping.java new file mode 100644 index 0000000..a7a7f2e --- /dev/null +++ b/src/desafio6solid/ExpressShipping.java @@ -0,0 +1,8 @@ +package desafio6solid; + +public class ExpressShipping implements Shipping { + @Override + public void shipOrder(String orderId) { + System.out.println("Enviando pedido " + orderId + " por transportadora expressa"); + } +} \ No newline at end of file diff --git a/src/desafio6solid/Notification.java b/src/desafio6solid/Notification.java new file mode 100644 index 0000000..90d7e6c --- /dev/null +++ b/src/desafio6solid/Notification.java @@ -0,0 +1,5 @@ +package desafio6solid; + +interface Notification { + void send(String message, String customer); +} diff --git a/src/desafio6solid/Order.java b/src/desafio6solid/Order.java new file mode 100644 index 0000000..dd5d718 --- /dev/null +++ b/src/desafio6solid/Order.java @@ -0,0 +1,17 @@ +package desafio6solid; + +public class Order { + private String id; + private String customer; + private double total; + + public Order(String id, String customer, double total) { + this.id = id; + this.customer = customer; + this.total = total; + } + + public String getId() { return id; } + public String getCustomer() { return customer; } + public double getTotal() { return total; } +} \ No newline at end of file diff --git a/src/desafio6solid/OrderProcessor.java b/src/desafio6solid/OrderProcessor.java new file mode 100644 index 0000000..ced0164 --- /dev/null +++ b/src/desafio6solid/OrderProcessor.java @@ -0,0 +1,36 @@ +package desafio6solid; + +public class OrderProcessor { + private Payment payment; + private Shipping shipping; + private Notification notification; + + // Injeção de dependências + public OrderProcessor(Payment payment, Shipping shipping, Notification notification) { + this.payment = payment; + this.shipping = shipping; + this.notification = notification; + } + + public boolean process(Order order) { + try { + // Processar pagamento + boolean paymentSuccess = payment.pay(order.getTotal()); + if (!paymentSuccess) { + return false; + } + + // Enviar pedido + shipping.shipOrder(order.getId()); + + // Enviar notificação + notification.send("Seu pedido " + order.getId() + " foi enviado!", order.getCustomer()); + + return true; + + } catch (Exception e) { + System.out.println("Erro: " + e.getMessage()); + return false; + } + } +} \ No newline at end of file diff --git a/src/desafio6solid/Payment.java b/src/desafio6solid/Payment.java new file mode 100644 index 0000000..15dfb39 --- /dev/null +++ b/src/desafio6solid/Payment.java @@ -0,0 +1,5 @@ +package desafio6solid; + +interface Payment { + boolean pay(double amount); +} diff --git a/src/desafio6solid/PixPayment.java b/src/desafio6solid/PixPayment.java new file mode 100644 index 0000000..4485eac --- /dev/null +++ b/src/desafio6solid/PixPayment.java @@ -0,0 +1,15 @@ +package desafio6solid; + +public class PixPayment implements Payment { + private String pixKey; + + public PixPayment(String pixKey) { + this.pixKey = pixKey; + } + + @Override + public boolean pay(double amount) { + System.out.println("Pagando R$" + amount + " via PIX: " + pixKey); + return true; + } +} \ No newline at end of file diff --git a/src/desafio6solid/SMSNotification.java b/src/desafio6solid/SMSNotification.java new file mode 100644 index 0000000..d8e6c12 --- /dev/null +++ b/src/desafio6solid/SMSNotification.java @@ -0,0 +1,8 @@ +package desafio6solid; + +public class SMSNotification implements Notification { + @Override + public void send(String message, String customer) { + System.out.println("SMS para " + customer + ": " + message); + } +} \ No newline at end of file diff --git a/src/desafio6solid/Shipping.java b/src/desafio6solid/Shipping.java new file mode 100644 index 0000000..58bc3be --- /dev/null +++ b/src/desafio6solid/Shipping.java @@ -0,0 +1,5 @@ +package desafio6solid; + +interface Shipping { + void shipOrder(String orderId); +}