diff --git a/README.2.MD b/README.2.MD new file mode 100644 index 0000000..46cd959 --- /dev/null +++ b/README.2.MD @@ -0,0 +1,35 @@ +# Lista de Exercícios - Princípios SOLID em Java + +## 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. + +--- + +## 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. + +--- + +## 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. + +--- + +## 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. + +--- + +## 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. + +--- + +## 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. \ No newline at end of file diff --git a/src/Main.java b/src/Main.java deleted file mode 100644 index fb31f50..0000000 --- a/src/Main.java +++ /dev/null @@ -1,54 +0,0 @@ -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.*; - -public class Main { - public static void main(String[] args) { - - //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); - - ImpostoRecord iva = new ImpostoRecord("2", "IVA"); - //iva.taxa(); - - Comparator compImposto = Comparator.comparing(Produto::getId) - .thenComparing(Produto::getValor); - //compImposto.compare(new Produto(), new Produto()); - - Integer numero = Integer.valueOf(10); - System.out.printf("O numeros sao iguais %d", numero.compareTo(Integer.valueOf(15))); - - - - - - 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(); - } -} \ No newline at end of file diff --git a/src/com/lojaonline/LojaOnline.java b/src/com/lojaonline/LojaOnline.java new file mode 100644 index 0000000..b74acc7 --- /dev/null +++ b/src/com/lojaonline/LojaOnline.java @@ -0,0 +1,36 @@ +package com.lojaonline; + +import com.lojaonline.envio.GerenciadorEnvio; +import com.lojaonline.pagamento.CartaoCredito; +import com.lojaonline.pagamento.MetodoPagamento; +import com.lojaonline.pagamento.ProcessadorPagamento; +import com.lojaonline.pedido.Pedido; +import com.lojaonline.produtos.Produto; +import com.lojaonline.repositorio.JpaPedidoRepositorio; +import com.lojaonline.repositorio.PedidoRepositorio; +import com.lojaonline.servicos.ServicoPedido; +import java.util.List; + +public class LojaOnline { + public static void main(String[] args) { + PedidoRepositorio repositorio = new JpaPedidoRepositorio(); + MetodoPagamento cartao = new CartaoCredito(); + ProcessadorPagamento processador = new ProcessadorPagamento(cartao); + GerenciadorEnvio gerenciador = new GerenciadorEnvio(); + + // Injeto as dependências no ServicoPedido + + ServicoPedido servicoPedido = new ServicoPedido(repositorio, processador, gerenciador); + + Produto motoserra = new Produto("Motoserra", 1500.00); + Produto capacete = new Produto("Capacete", 300.00); + Produto luvas = new Produto("Luvas", 50.00); + List itens = List.of(motoserra, capacete, luvas); + + Pedido pedido = new Pedido(itens, "Rua das Flores, 123"); + servicoPedido.criarNovoPedido(pedido); + servicoPedido.processarPedido(1L); + servicoPedido.enviarPedido(1l); + } + +} diff --git a/src/com/lojaonline/envio/GerenciadorEnvio.java b/src/com/lojaonline/envio/GerenciadorEnvio.java new file mode 100644 index 0000000..aacd14c --- /dev/null +++ b/src/com/lojaonline/envio/GerenciadorEnvio.java @@ -0,0 +1,9 @@ +package com.lojaonline.envio; + +public class GerenciadorEnvio { + public void enviarPedido(String endereco) { + // Lógica para enviar o pedido para o endereço fornecido + System.out.println("Enviando pedido para: " + endereco); + } + +} diff --git a/src/com/lojaonline/notificacao/Notificador.java b/src/com/lojaonline/notificacao/Notificador.java new file mode 100644 index 0000000..7b78258 --- /dev/null +++ b/src/com/lojaonline/notificacao/Notificador.java @@ -0,0 +1,6 @@ +package com.lojaonline.notificacao; + +public interface Notificador { + void notificar(String mensagem); + +} diff --git a/src/com/lojaonline/notificacao/NotificadorEmail.java b/src/com/lojaonline/notificacao/NotificadorEmail.java new file mode 100644 index 0000000..762b75c --- /dev/null +++ b/src/com/lojaonline/notificacao/NotificadorEmail.java @@ -0,0 +1,10 @@ +package com.lojaonline.notificacao; + +public class NotificadorEmail implements Notificador{ + + @Override + public void notificar(String mensagem) { + System.out.println("Enviando notificação por Email: " + mensagem); + + } +} diff --git a/src/com/lojaonline/notificacao/NotificadorSMS.java b/src/com/lojaonline/notificacao/NotificadorSMS.java new file mode 100644 index 0000000..a946332 --- /dev/null +++ b/src/com/lojaonline/notificacao/NotificadorSMS.java @@ -0,0 +1,10 @@ +package com.lojaonline.notificacao; + +public class NotificadorSMS implements Notificador{ + @Override + public void notificar(String mensagem) { + System.out.println("Enviando notificação por SMS: " + mensagem); + + } + +} diff --git a/src/com/lojaonline/pagamento/Boleto.java b/src/com/lojaonline/pagamento/Boleto.java new file mode 100644 index 0000000..b230af9 --- /dev/null +++ b/src/com/lojaonline/pagamento/Boleto.java @@ -0,0 +1,10 @@ +package com.lojaonline.pagamento; + +public class Boleto implements MetodoPagamento{ + + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento via Boleto no valor de: R$" + valor); + + } +} diff --git a/src/com/lojaonline/pagamento/CartaoCredito.java b/src/com/lojaonline/pagamento/CartaoCredito.java new file mode 100644 index 0000000..170835b --- /dev/null +++ b/src/com/lojaonline/pagamento/CartaoCredito.java @@ -0,0 +1,10 @@ +package com.lojaonline.pagamento; + +public class CartaoCredito implements MetodoPagamento{ + + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento via Cartão de Crédito no valor de: R$" + valor); + + } +} diff --git a/src/com/lojaonline/pagamento/MetodoPagamento.java b/src/com/lojaonline/pagamento/MetodoPagamento.java new file mode 100644 index 0000000..39955e5 --- /dev/null +++ b/src/com/lojaonline/pagamento/MetodoPagamento.java @@ -0,0 +1,6 @@ +package com.lojaonline.pagamento; + +public interface MetodoPagamento { + void processarPagamento(double valor); + +} diff --git a/src/com/lojaonline/pagamento/Pix.java b/src/com/lojaonline/pagamento/Pix.java new file mode 100644 index 0000000..bd954f2 --- /dev/null +++ b/src/com/lojaonline/pagamento/Pix.java @@ -0,0 +1,9 @@ +package com.lojaonline.pagamento; + +public class Pix implements MetodoPagamento{ + + @Override + public void processarPagamento(double valor) { + System.out.println("Processando pagamento via Pix no valor de: R$" + valor); + } +} diff --git a/src/com/lojaonline/pagamento/ProcessadorPagamento.java b/src/com/lojaonline/pagamento/ProcessadorPagamento.java new file mode 100644 index 0000000..5de5a6b --- /dev/null +++ b/src/com/lojaonline/pagamento/ProcessadorPagamento.java @@ -0,0 +1,16 @@ +package com.lojaonline.pagamento; + +public class ProcessadorPagamento { + T metodoPagamento; + + public ProcessadorPagamento(T metodoPagamento) { + this.metodoPagamento = metodoPagamento; + } + + + public void processar(double valor) { + metodoPagamento.processarPagamento(valor); + } + + +} diff --git a/src/com/lojaonline/pedido/Pedido.java b/src/com/lojaonline/pedido/Pedido.java new file mode 100644 index 0000000..c08ecfe --- /dev/null +++ b/src/com/lojaonline/pedido/Pedido.java @@ -0,0 +1,45 @@ +package com.lojaonline.pedido; + +import com.lojaonline.produtos.Produto; +import java.util.List; + +public class Pedido { + List itens; + String status; + + String enderecoEntrega; + + public Pedido(List itens, String enderecoEntrega ) { + this.itens = itens; + this.status = "PENDENTE"; + this.enderecoEntrega = enderecoEntrega; + } + + public List getItens() { + return itens; + } + + public double calcularTotal() { + return itens.stream().mapToDouble(Produto::getPreco).sum(); + } + + public void addItem(Produto produto) { + itens.add(produto); + } + + public void removerItem(Produto produto) { + itens.remove(produto); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getEnderecoEntrega() { + return enderecoEntrega; + } +} diff --git a/src/com/lojaonline/produtos/Produto.java b/src/com/lojaonline/produtos/Produto.java new file mode 100644 index 0000000..9ca7495 --- /dev/null +++ b/src/com/lojaonline/produtos/Produto.java @@ -0,0 +1,22 @@ +package com.lojaonline.produtos; + +public class Produto { + + private String nome; + private double preco; + + public Produto(String nome, double preco) { + this.nome = nome; + this.preco = preco; + } + + public String getNome() { + return nome; + } + + public double getPreco() { + return preco; + } + + +} diff --git a/src/com/lojaonline/repositorio/JpaPedidoRepositorio.java b/src/com/lojaonline/repositorio/JpaPedidoRepositorio.java new file mode 100644 index 0000000..7b31380 --- /dev/null +++ b/src/com/lojaonline/repositorio/JpaPedidoRepositorio.java @@ -0,0 +1,47 @@ +package com.lojaonline.repositorio; + +import com.lojaonline.pedido.Pedido; +import java.util.List; + +public class JpaPedidoRepositorio implements PedidoRepositorio { + + @Override + public void salvar(Pedido pedido) { + + } + + @Override + public Pedido buscarPorId(long id) { + return null; + } + + @Override + public List buscarPorStatus(String status) { + return null; + } + + @Override + public void salvar(Object obj) { + + } + + @Override + public void atualizar(Object obj) { + + } + + @Override + public void deletar(Object obj) { + + } + + @Override + public Object buscarPorId(int id) { + return null; + } + + @Override + public List buscarTodos() { + return null; + } +} diff --git a/src/com/lojaonline/repositorio/PedidoRepositorio.java b/src/com/lojaonline/repositorio/PedidoRepositorio.java new file mode 100644 index 0000000..45795f2 --- /dev/null +++ b/src/com/lojaonline/repositorio/PedidoRepositorio.java @@ -0,0 +1,14 @@ +package com.lojaonline.repositorio; + +import com.lojaonline.pedido.Pedido; +import java.util.List; + +public interface PedidoRepositorio extends Repositorio { + + void salvar(Pedido pedido); + + Pedido buscarPorId(long id); + + List buscarPorStatus(String status); + +} diff --git a/src/com/lojaonline/repositorio/Repositorio.java b/src/com/lojaonline/repositorio/Repositorio.java new file mode 100644 index 0000000..cf28628 --- /dev/null +++ b/src/com/lojaonline/repositorio/Repositorio.java @@ -0,0 +1,17 @@ +package com.lojaonline.repositorio; + +import java.util.List; + +public interface Repositorio { + + public void salvar(Object obj); + + public void atualizar(Object obj); + + public void deletar(Object obj); + + public Object buscarPorId(int id); + + public List buscarTodos(); + +} diff --git a/src/com/lojaonline/servicos/ServicoPedido.java b/src/com/lojaonline/servicos/ServicoPedido.java new file mode 100644 index 0000000..c3c1ec0 --- /dev/null +++ b/src/com/lojaonline/servicos/ServicoPedido.java @@ -0,0 +1,51 @@ +package com.lojaonline.servicos; + + +// com.lojaonline.servicos.ServicoPedido.java +import com.lojaonline.pedido.Pedido; +import com.lojaonline.repositorio.PedidoRepositorio; +import com.lojaonline.pagamento.ProcessadorPagamento; +import com.lojaonline.envio.GerenciadorEnvio; +public class ServicoPedido { + private final PedidoRepositorio pedidoRepositorio; + private final ProcessadorPagamento processadorPagamento; + private final GerenciadorEnvio gerenciadorEnvio; + + public ServicoPedido(PedidoRepositorio pedidoRepositorio, + ProcessadorPagamento processadorPagamento, + GerenciadorEnvio gerenciadorEnvio) { + this.pedidoRepositorio = pedidoRepositorio; + this.processadorPagamento = processadorPagamento; + this.gerenciadorEnvio = gerenciadorEnvio; + } + + public void criarNovoPedido(Pedido pedido) { + pedidoRepositorio.salvar(pedido); + System.out.println("Novo pedido criado com sucesso!"); + } + + public void processarPedido(long pedidoId) { + Pedido pedido = pedidoRepositorio.buscarPorId(pedidoId); + if (pedido == null) { + System.out.println("Pedido não encontrado!"); + return; + } + processadorPagamento.processar(pedido.calcularTotal()); + pedido.setStatus("Pago"); + pedidoRepositorio.salvar(pedido); + System.out.println("Pedido pago com sucesso!"); + } + + public void enviarPedido(long pedidoId) { + Pedido pedido = pedidoRepositorio.buscarPorId(pedidoId); + if (pedido == null) { + System.out.println("Pedido não encontrado!"); + return; + } + gerenciadorEnvio.enviarPedido(pedido.getEnderecoEntrega()); + pedido.setStatus("Enviado"); + pedidoRepositorio.salvar(pedido); + System.out.println("Pedido enviado com sucesso!"); + } + +} diff --git a/src/exemplo/ecommerce/Produto.java b/src/exemplo/ecommerce/Produto.java deleted file mode 100644 index 41b3610..0000000 --- a/src/exemplo/ecommerce/Produto.java +++ /dev/null @@ -1,54 +0,0 @@ -package exemplo.ecommerce; - -import java.math.BigDecimal; -import java.util.Comparator; - -public class Produto implements Comparable { - - - private Integer id; - private String descricao; - private BigDecimal valor; - - - public Integer getId() { - return id; - } - - public Produto(Integer id, String descricao, BigDecimal valor) { - this.id = id; - this.descricao = descricao; - this.valor = valor; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getDescricao() { - return descricao; - } - - public void setDescricao(String descricao) { - this.descricao = descricao; - } - - public BigDecimal getValor() { - return valor; - } - - public void setValor(BigDecimal valor) { - this.valor = valor; - } - - @Override - public int compareTo(Produto produto) { - if(this.getId() < produto.getId()) { - return -1; - } - if(this.getId() > produto.getId()) { - return 1; - } - return 0; - } -} diff --git a/src/exemplo/imposto/Dedutivel.java b/src/exemplo/imposto/Dedutivel.java deleted file mode 100644 index b797665..0000000 --- a/src/exemplo/imposto/Dedutivel.java +++ /dev/null @@ -1,4 +0,0 @@ -package exemplo.imposto; - -public interface Dedutivel { -} diff --git a/src/exemplo/imposto/ICMS.java b/src/exemplo/imposto/ICMS.java deleted file mode 100644 index bdf25ef..0000000 --- a/src/exemplo/imposto/ICMS.java +++ /dev/null @@ -1,55 +0,0 @@ -package exemplo.imposto; - -import java.util.Comparator; - -public class ICMS implements Imposto, Comparable { - - public Double taxa; - public Double percentual; - public ICMS(Double taxa){ - this.taxa = taxa; - } - - public Double getTaxa() { - return taxa; - } - - public void setTaxa(Double taxa) { - this.taxa = taxa; - } - - public Double getPercentual() { - return percentual; - } - - public void setPercentual(Double percentual) { - this.percentual = percentual; - } - - @Override - public void calcular(){ - System.out.println("CALCULANDO ICMS"); - } - - @Override - public int compareTo(ICMS o) { - - /* if(this.taxa < o.taxa - && this.percentual < o.percentual) { - - return -1; - } - - if(this.taxa > o.taxa - && this.percentual > o.percentual) { - - return 1; - - return 0;*/ - Comparator comp = Comparator.comparing(ICMS::getTaxa) - .thenComparing(ICMS::getPercentual); - - return comp.compare(this, o); - - } -} diff --git a/src/exemplo/imposto/IOF.java b/src/exemplo/imposto/IOF.java deleted file mode 100644 index a28db29..0000000 --- a/src/exemplo/imposto/IOF.java +++ /dev/null @@ -1,13 +0,0 @@ -package exemplo.imposto; - -public class IOF implements Imposto { - - public Double taxa; - public IOF(Double taxa){ - this.taxa = taxa; - } - - @Override - public void calcular(){} - -} diff --git a/src/exemplo/imposto/IVA.java b/src/exemplo/imposto/IVA.java deleted file mode 100644 index 3d5ad51..0000000 --- a/src/exemplo/imposto/IVA.java +++ /dev/null @@ -1,4 +0,0 @@ -package exemplo.imposto; - -public class IVA { -} diff --git a/src/exemplo/imposto/Imposto.java b/src/exemplo/imposto/Imposto.java deleted file mode 100644 index 740e602..0000000 --- a/src/exemplo/imposto/Imposto.java +++ /dev/null @@ -1,18 +0,0 @@ -package exemplo.imposto; - -public interface Imposto extends Dedutivel { - - static Double BASE_CALCULO = 10D; - - void calcular(); - - default void imprimir() { - System.out.println("Imposto"); - calcular(); - } - - default void imprimir2() { - System.out.println("Imposto"); - } - -} diff --git a/src/exemplo/imposto/ImpostoAbstract.java b/src/exemplo/imposto/ImpostoAbstract.java deleted file mode 100644 index 14e6e63..0000000 --- a/src/exemplo/imposto/ImpostoAbstract.java +++ /dev/null @@ -1,11 +0,0 @@ -package exemplo.imposto; - -public abstract class ImpostoAbstract { - - public abstract void calcular(); - - public void imprimir(){ - System.out.println("Imprimir"); - calcular(); - } -} diff --git a/src/exemplo/imposto/ImpostoRecord.java b/src/exemplo/imposto/ImpostoRecord.java deleted file mode 100644 index 9833083..0000000 --- a/src/exemplo/imposto/ImpostoRecord.java +++ /dev/null @@ -1,4 +0,0 @@ -package exemplo.imposto; - -public record ImpostoRecord (String taxa, String nome) { -}