Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 19 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.
65 changes: 25 additions & 40 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -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<Produto> 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<Produto> 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);
}
}
8 changes: 8 additions & 0 deletions src/desafio6solid/CorreioShipping.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
15 changes: 15 additions & 0 deletions src/desafio6solid/CreditCardPayment.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
8 changes: 8 additions & 0 deletions src/desafio6solid/EmailNotification.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
8 changes: 8 additions & 0 deletions src/desafio6solid/ExpressShipping.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
5 changes: 5 additions & 0 deletions src/desafio6solid/Notification.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package desafio6solid;

interface Notification {
void send(String message, String customer);
}
17 changes: 17 additions & 0 deletions src/desafio6solid/Order.java
Original file line number Diff line number Diff line change
@@ -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; }
}
36 changes: 36 additions & 0 deletions src/desafio6solid/OrderProcessor.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
5 changes: 5 additions & 0 deletions src/desafio6solid/Payment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package desafio6solid;

interface Payment {
boolean pay(double amount);
}
15 changes: 15 additions & 0 deletions src/desafio6solid/PixPayment.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
8 changes: 8 additions & 0 deletions src/desafio6solid/SMSNotification.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
5 changes: 5 additions & 0 deletions src/desafio6solid/Shipping.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package desafio6solid;

interface Shipping {
void shipOrder(String orderId);
}