From c2bea1c3d59c79340c3863151ab325b54ca3d40a Mon Sep 17 00:00:00 2001 From: MILTON LUIZ SINHORINI JUNIOR Date: Mon, 1 Sep 2025 20:23:19 -0300 Subject: [PATCH] Solid --- src/Solid/Exercicio01/EmailService.java | 9 ++++ src/Solid/Exercicio01/Relatorio.java | 13 ++++++ src/Solid/Exercicio02/Desconto.java | 5 +++ src/Solid/Exercicio02/DescontoFixo.java | 14 +++++++ .../Exercicio02/DescontoPorcentagem.java | 14 +++++++ src/Solid/Exercicio02/Loja.java | 27 ++++++++++++ src/Solid/Exercicio03/FormaGeometrica.java | 5 +++ src/Solid/Exercicio03/Quadrado.java | 15 +++++++ src/Solid/Exercicio03/Retangulo.java | 18 ++++++++ src/Solid/Exercicio04/Trabalhador.java | 7 ++++ src/Solid/Exercicio04/TrabalhadorEstudo.java | 5 +++ .../Exercicio04/TrabalhadorTrabalho.java | 5 +++ src/Solid/Exercicio05/EmailService.java | 8 ++++ src/Solid/Exercicio05/Notificador.java | 14 +++++++ .../Exercicio05/NotificadorRefatorado.java | 13 ++++++ src/Solid/Exercicio05/ServicoNotificacao.java | 5 +++ src/Solid/Exercicio06/LojaOnline.java | 41 +++++++++++++++++++ .../Exercicio06/envio/EnvioCorreios.java | 11 +++++ src/Solid/Exercicio06/envio/ServicoEnvio.java | 8 ++++ .../Exercicio06/pagamento/Pagamento.java | 6 +++ .../pagamento/PagamentoBoleto.java | 17 ++++++++ .../pagamento/PagamentoCartaoCredito.java | 19 +++++++++ src/Solid/Exercicio06/pedido/Pedido.java | 38 +++++++++++++++++ src/Solid/Exercicio06/produto/Produto.java | 8 ++++ .../Exercicio06/produto/ProdutoPadrao.java | 27 ++++++++++++ 25 files changed, 352 insertions(+) create mode 100644 src/Solid/Exercicio01/EmailService.java create mode 100644 src/Solid/Exercicio01/Relatorio.java create mode 100644 src/Solid/Exercicio02/Desconto.java create mode 100644 src/Solid/Exercicio02/DescontoFixo.java create mode 100644 src/Solid/Exercicio02/DescontoPorcentagem.java create mode 100644 src/Solid/Exercicio02/Loja.java create mode 100644 src/Solid/Exercicio03/FormaGeometrica.java create mode 100644 src/Solid/Exercicio03/Quadrado.java create mode 100644 src/Solid/Exercicio03/Retangulo.java create mode 100644 src/Solid/Exercicio04/Trabalhador.java create mode 100644 src/Solid/Exercicio04/TrabalhadorEstudo.java create mode 100644 src/Solid/Exercicio04/TrabalhadorTrabalho.java create mode 100644 src/Solid/Exercicio05/EmailService.java create mode 100644 src/Solid/Exercicio05/Notificador.java create mode 100644 src/Solid/Exercicio05/NotificadorRefatorado.java create mode 100644 src/Solid/Exercicio05/ServicoNotificacao.java create mode 100644 src/Solid/Exercicio06/LojaOnline.java create mode 100644 src/Solid/Exercicio06/envio/EnvioCorreios.java create mode 100644 src/Solid/Exercicio06/envio/ServicoEnvio.java create mode 100644 src/Solid/Exercicio06/pagamento/Pagamento.java create mode 100644 src/Solid/Exercicio06/pagamento/PagamentoBoleto.java create mode 100644 src/Solid/Exercicio06/pagamento/PagamentoCartaoCredito.java create mode 100644 src/Solid/Exercicio06/pedido/Pedido.java create mode 100644 src/Solid/Exercicio06/produto/Produto.java create mode 100644 src/Solid/Exercicio06/produto/ProdutoPadrao.java diff --git a/src/Solid/Exercicio01/EmailService.java b/src/Solid/Exercicio01/EmailService.java new file mode 100644 index 0000000..484a4d3 --- /dev/null +++ b/src/Solid/Exercicio01/EmailService.java @@ -0,0 +1,9 @@ +package Solid.Exercicio01; + +public class EmailService { + public void enviarEmail(String destinatario, String mensagem) { + System.out.println("Enviando email para: " + destinatario); + System.out.println("Mensagem: " + mensagem); + // Lógica para enviar o email + } +} diff --git a/src/Solid/Exercicio01/Relatorio.java b/src/Solid/Exercicio01/Relatorio.java new file mode 100644 index 0000000..a1229e8 --- /dev/null +++ b/src/Solid/Exercicio01/Relatorio.java @@ -0,0 +1,13 @@ +package Solid.Exercicio01; + +public class Relatorio { + private String conteudo; + + public Relatorio(String conteudo) { + this.conteudo = conteudo; + } + + public String gerarRelatorio() { + return "Relatório gerado: " + conteudo; + } +} diff --git a/src/Solid/Exercicio02/Desconto.java b/src/Solid/Exercicio02/Desconto.java new file mode 100644 index 0000000..2e482e6 --- /dev/null +++ b/src/Solid/Exercicio02/Desconto.java @@ -0,0 +1,5 @@ +package Solid.Exercicio02; + +public interface Desconto { + double aplicarDesconto(double valor); +} diff --git a/src/Solid/Exercicio02/DescontoFixo.java b/src/Solid/Exercicio02/DescontoFixo.java new file mode 100644 index 0000000..667f2e7 --- /dev/null +++ b/src/Solid/Exercicio02/DescontoFixo.java @@ -0,0 +1,14 @@ +package Solid.Exercicio02; + +public class DescontoFixo implements Desconto { + private double valorFixo; + + public DescontoFixo(double valorFixo) { + this.valorFixo = valorFixo; + } + + @Override + public double aplicarDesconto(double valor) { + return valor - valorFixo; + } +} diff --git a/src/Solid/Exercicio02/DescontoPorcentagem.java b/src/Solid/Exercicio02/DescontoPorcentagem.java new file mode 100644 index 0000000..86de91c --- /dev/null +++ b/src/Solid/Exercicio02/DescontoPorcentagem.java @@ -0,0 +1,14 @@ +package Solid.Exercicio02; + +public class DescontoPorcentagem implements Desconto { + private double porcentagem; + + public DescontoPorcentagem(double porcentagem) { + this.porcentagem = porcentagem / 100.0; + } + + @Override + public double aplicarDesconto(double valor) { + return valor * (1 - porcentagem); + } +} diff --git a/src/Solid/Exercicio02/Loja.java b/src/Solid/Exercicio02/Loja.java new file mode 100644 index 0000000..23149f2 --- /dev/null +++ b/src/Solid/Exercicio02/Loja.java @@ -0,0 +1,27 @@ +package Solid.Exercicio02; + +public class Loja { + private String nome; + + public Loja(String nome) { + this.nome = nome; + } + + public double calcularPrecoComDesconto(double precoOriginal, Desconto desconto) { + return desconto.aplicarDesconto(precoOriginal); + } + + public static void main(String[] args) { + Loja minhaLoja = new Loja("Minha Loja"); + + // Exemplo de uso com desconto fixo + Desconto descontoFixo = new DescontoFixo(10.0); + double precoComDescontoFixo = minhaLoja.calcularPrecoComDesconto(100.0, descontoFixo); + System.out.println("Preço com desconto fixo: R$" + precoComDescontoFixo); + + // Exemplo de uso com desconto percentual + Desconto descontoPorcentagem = new DescontoPorcentagem(15.0); // 15% de desconto + double precoComDescontoPorcentagem = minhaLoja.calcularPrecoComDesconto(100.0, descontoPorcentagem); + System.out.println("Preço com 15% de desconto: R$" + precoComDescontoPorcentagem); + } +} diff --git a/src/Solid/Exercicio03/FormaGeometrica.java b/src/Solid/Exercicio03/FormaGeometrica.java new file mode 100644 index 0000000..6f2dbbb --- /dev/null +++ b/src/Solid/Exercicio03/FormaGeometrica.java @@ -0,0 +1,5 @@ +package Solid.Exercicio03; + +public interface FormaGeometrica { + double calcularArea(); +} diff --git a/src/Solid/Exercicio03/Quadrado.java b/src/Solid/Exercicio03/Quadrado.java new file mode 100644 index 0000000..5aed1d0 --- /dev/null +++ b/src/Solid/Exercicio03/Quadrado.java @@ -0,0 +1,15 @@ +package Solid.Exercicio03; + +public class Quadrado extends Retangulo { + @Override + public void setLargura(double lado) { + this.largura = lado; + this.altura = lado; + } + + @Override + public void setAltura(double lado) { + this.largura = lado; + this.altura = lado; + } +} diff --git a/src/Solid/Exercicio03/Retangulo.java b/src/Solid/Exercicio03/Retangulo.java new file mode 100644 index 0000000..eac8dfd --- /dev/null +++ b/src/Solid/Exercicio03/Retangulo.java @@ -0,0 +1,18 @@ +package Solid.Exercicio03; + +public class Retangulo { + protected double largura; + protected double altura; + + public void setLargura(double largura) { + this.largura = largura; + } + + public void setAltura(double altura) { + this.altura = altura; + } + + public double getArea() { + return largura * altura; + } +} diff --git a/src/Solid/Exercicio04/Trabalhador.java b/src/Solid/Exercicio04/Trabalhador.java new file mode 100644 index 0000000..74b3936 --- /dev/null +++ b/src/Solid/Exercicio04/Trabalhador.java @@ -0,0 +1,7 @@ +package Solid.Exercicio04; + +// Interface que viola o ISP +public interface Trabalhador { + void trabalhar(); + void estudar(); +} diff --git a/src/Solid/Exercicio04/TrabalhadorEstudo.java b/src/Solid/Exercicio04/TrabalhadorEstudo.java new file mode 100644 index 0000000..d6d55e6 --- /dev/null +++ b/src/Solid/Exercicio04/TrabalhadorEstudo.java @@ -0,0 +1,5 @@ +package Solid.Exercicio04; + +public interface TrabalhadorEstudo { + void estudar(); +} diff --git a/src/Solid/Exercicio04/TrabalhadorTrabalho.java b/src/Solid/Exercicio04/TrabalhadorTrabalho.java new file mode 100644 index 0000000..844c9b5 --- /dev/null +++ b/src/Solid/Exercicio04/TrabalhadorTrabalho.java @@ -0,0 +1,5 @@ +package Solid.Exercicio04; + +public interface TrabalhadorTrabalho { + void trabalhar(); +} diff --git a/src/Solid/Exercicio05/EmailService.java b/src/Solid/Exercicio05/EmailService.java new file mode 100644 index 0000000..171b991 --- /dev/null +++ b/src/Solid/Exercicio05/EmailService.java @@ -0,0 +1,8 @@ +package Solid.Exercicio05; + +public class EmailService { + public void enviarEmail(String destinatario, String mensagem) { + System.out.println("Enviando email para: " + destinatario); + System.out.println("Mensagem: " + mensagem); + } +} diff --git a/src/Solid/Exercicio05/Notificador.java b/src/Solid/Exercicio05/Notificador.java new file mode 100644 index 0000000..61ab861 --- /dev/null +++ b/src/Solid/Exercicio05/Notificador.java @@ -0,0 +1,14 @@ +package Solid.Exercicio05; + +// Classe que viola o DIP +public class Notificador { + private EmailService emailService; + + public Notificador() { + this.emailService = new EmailService(); + } + + public void enviarNotificacao(String mensagem) { + emailService.enviarEmail("usuario@exemplo.com", mensagem); + } +} diff --git a/src/Solid/Exercicio05/NotificadorRefatorado.java b/src/Solid/Exercicio05/NotificadorRefatorado.java new file mode 100644 index 0000000..e8a6060 --- /dev/null +++ b/src/Solid/Exercicio05/NotificadorRefatorado.java @@ -0,0 +1,13 @@ +package Solid.Exercicio05; + +public class NotificadorRefatorado { + private ServicoNotificacao servicoNotificacao; + + public NotificadorRefatorado(ServicoNotificacao servico) { + this.servicoNotificacao = servico; + } + + public void enviarNotificacao(String mensagem) { + servicoNotificacao.enviarNotificacao("usuario@exemplo.com", mensagem); + } +} diff --git a/src/Solid/Exercicio05/ServicoNotificacao.java b/src/Solid/Exercicio05/ServicoNotificacao.java new file mode 100644 index 0000000..50561fa --- /dev/null +++ b/src/Solid/Exercicio05/ServicoNotificacao.java @@ -0,0 +1,5 @@ +package Solid.Exercicio05; + +public interface ServicoNotificacao { + void enviarNotificacao(String destinatario, String mensagem); +} diff --git a/src/Solid/Exercicio06/LojaOnline.java b/src/Solid/Exercicio06/LojaOnline.java new file mode 100644 index 0000000..fb59f5e --- /dev/null +++ b/src/Solid/Exercicio06/LojaOnline.java @@ -0,0 +1,41 @@ +package Solid.Exercicio06; + +import Solid.Exercicio06.pedido.Pedido; +import Solid.Exercicio06.produto.ProdutoPadrao; +import Solid.Exercicio06.pagamento.PagamentoCartaoCredito; +import Solid.Exercicio06.pagamento.PagamentoBoleto; +import Solid.Exercicio06.envio.EnvioCorreios; + +public class LojaOnline { + public static void main(String[] args) { + // Criando produtos + ProdutoPadrao produto1 = new ProdutoPadrao("Notebook", 3500.0); + ProdutoPadrao produto2 = new ProdutoPadrao("Mouse", 120.0); + + // Criando pedido + Pedido pedido = new Pedido(); + pedido.adicionarProduto(produto1); + pedido.adicionarProduto(produto2); + + // Processando pagamento com cartão de crédito + System.out.println("=== Processando com cartão de crédito ==="); + pedido.setPagamento(new PagamentoCartaoCredito("1234 5678 9012 3456", "João Silva")); + boolean pagamentoSucesso = pedido.processarPagamento(); + + if (pagamentoSucesso) { + System.out.println("Pedido finalizado com sucesso!"); + System.out.println("Total: R$" + pedido.calcularTotal()); + + // Enviando pedido (DIP: dependendo da abstração, não da implementação) + EnvioCorreios envio = new EnvioCorreios(); + envio.enviarPedido(pedido); + } + + // Exemplo com boleto + System.out.println("\n=== Processando com boleto ==="); + Pedido pedidoBoleto = new Pedido(); + pedidoBoleto.adicionarProduto(new ProdutoPadrao("Teclado", 250.0)); + pedidoBoleto.setPagamento(new PagamentoBoleto("12345678901234567890123456789012345678901234")); + pedidoBoleto.processarPagamento(); + } +} diff --git a/src/Solid/Exercicio06/envio/EnvioCorreios.java b/src/Solid/Exercicio06/envio/EnvioCorreios.java new file mode 100644 index 0000000..32e70f8 --- /dev/null +++ b/src/Solid/Exercicio06/envio/EnvioCorreios.java @@ -0,0 +1,11 @@ +package Solid.Exercicio06.envio; + +import Solid.Exercicio06.pedido.Pedido; + +public class EnvioCorreios implements ServicoEnvio { + @Override + public void enviarPedido(Pedido pedido) { + System.out.println("Enviando pedido pelos Correios..."); + // Lógica de envio pelos Correios + } +} diff --git a/src/Solid/Exercicio06/envio/ServicoEnvio.java b/src/Solid/Exercicio06/envio/ServicoEnvio.java new file mode 100644 index 0000000..9e8cd5d --- /dev/null +++ b/src/Solid/Exercicio06/envio/ServicoEnvio.java @@ -0,0 +1,8 @@ +package Solid.Exercicio06.envio; + +import Solid.Exercicio06.pedido.Pedido; + +// ISP: Interface específica para serviços de envio +public interface ServicoEnvio { + void enviarPedido(Pedido pedido); +} diff --git a/src/Solid/Exercicio06/pagamento/Pagamento.java b/src/Solid/Exercicio06/pagamento/Pagamento.java new file mode 100644 index 0000000..588384a --- /dev/null +++ b/src/Solid/Exercicio06/pagamento/Pagamento.java @@ -0,0 +1,6 @@ +package Solid.Exercicio06.pagamento; + +// DIP: Interface de alto nível para pagamentos +public interface Pagamento { + boolean processarPagamento(double valor); +} diff --git a/src/Solid/Exercicio06/pagamento/PagamentoBoleto.java b/src/Solid/Exercicio06/pagamento/PagamentoBoleto.java new file mode 100644 index 0000000..b163070 --- /dev/null +++ b/src/Solid/Exercicio06/pagamento/PagamentoBoleto.java @@ -0,0 +1,17 @@ +package Solid.Exercicio06.pagamento; + +// OCP: Outro tipo de pagamento que pode ser adicionado facilmente +public class PagamentoBoleto implements Pagamento { + private String codigoBarras; + + public PagamentoBoleto(String codigoBarras) { + this.codigoBarras = codigoBarras; + } + + @Override + public boolean processarPagamento(double valor) { + System.out.println("Gerando boleto no valor de R$" + valor); + System.out.println("Código de barras: " + codigoBarras); + return true; + } +} diff --git a/src/Solid/Exercicio06/pagamento/PagamentoCartaoCredito.java b/src/Solid/Exercicio06/pagamento/PagamentoCartaoCredito.java new file mode 100644 index 0000000..4ec6cb5 --- /dev/null +++ b/src/Solid/Exercicio06/pagamento/PagamentoCartaoCredito.java @@ -0,0 +1,19 @@ +package Solid.Exercicio06.pagamento; + +// OCP: Nova forma de pagamento pode ser adicionada sem modificar o código existente +public class PagamentoCartaoCredito implements Pagamento { + private String numeroCartao; + private String nomeTitular; + + public PagamentoCartaoCredito(String numeroCartao, String nomeTitular) { + this.numeroCartao = numeroCartao; + this.nomeTitular = nomeTitular; + } + + @Override + public boolean processarPagamento(double valor) { + System.out.println("Processando pagamento de R$" + valor + " via cartão de crédito"); + // Lógica de processamento do cartão de crédito + return true; + } +} diff --git a/src/Solid/Exercicio06/pedido/Pedido.java b/src/Solid/Exercicio06/pedido/Pedido.java new file mode 100644 index 0000000..ec21236 --- /dev/null +++ b/src/Solid/Exercicio06/pedido/Pedido.java @@ -0,0 +1,38 @@ +package Solid.Exercicio06.pedido; + +import Solid.Exercicio06.pagamento.Pagamento; +import Solid.Exercicio06.produto.Produto; + +import java.util.ArrayList; +import java.util.List; + +// SRP: Responsável apenas por gerenciar um pedido +public class Pedido { + private List produtos; + private Pagamento pagamento; + + public Pedido() { + this.produtos = new ArrayList<>(); + } + + public void adicionarProduto(Produto produto) { + this.produtos.add(produto); + } + + public void setPagamento(Pagamento pagamento) { + this.pagamento = pagamento; + } + + public double calcularTotal() { + return produtos.stream() + .mapToDouble(Produto::getPreco) + .sum(); + } + + public boolean processarPagamento() { + if (pagamento == null) { + return false; + } + return pagamento.processarPagamento(this.calcularTotal()); + } +} diff --git a/src/Solid/Exercicio06/produto/Produto.java b/src/Solid/Exercicio06/produto/Produto.java new file mode 100644 index 0000000..c39a427 --- /dev/null +++ b/src/Solid/Exercicio06/produto/Produto.java @@ -0,0 +1,8 @@ +package Solid.Exercicio06.produto; + +// ISP: Interface específica para produtos +public interface Produto { + String getNome(); + double getPreco(); + void setPreco(double preco); +} diff --git a/src/Solid/Exercicio06/produto/ProdutoPadrao.java b/src/Solid/Exercicio06/produto/ProdutoPadrao.java new file mode 100644 index 0000000..4b6d7ef --- /dev/null +++ b/src/Solid/Exercicio06/produto/ProdutoPadrao.java @@ -0,0 +1,27 @@ +package Solid.Exercicio06.produto; + +// LSP: Implementação concreta de Produto que pode ser substituída por qualquer outra implementação +public class ProdutoPadrao implements Produto { + private String nome; + private double preco; + + public ProdutoPadrao(String nome, double preco) { + this.nome = nome; + this.preco = preco; + } + + @Override + public String getNome() { + return nome; + } + + @Override + public double getPreco() { + return preco; + } + + @Override + public void setPreco(double preco) { + this.preco = preco; + } +}