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
9 changes: 9 additions & 0 deletions src/Solid/Exercicio01/EmailService.java
Original file line number Diff line number Diff line change
@@ -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
}
}
13 changes: 13 additions & 0 deletions src/Solid/Exercicio01/Relatorio.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
5 changes: 5 additions & 0 deletions src/Solid/Exercicio02/Desconto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package Solid.Exercicio02;

public interface Desconto {
double aplicarDesconto(double valor);
}
14 changes: 14 additions & 0 deletions src/Solid/Exercicio02/DescontoFixo.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
14 changes: 14 additions & 0 deletions src/Solid/Exercicio02/DescontoPorcentagem.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
27 changes: 27 additions & 0 deletions src/Solid/Exercicio02/Loja.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
5 changes: 5 additions & 0 deletions src/Solid/Exercicio03/FormaGeometrica.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package Solid.Exercicio03;

public interface FormaGeometrica {
double calcularArea();
}
15 changes: 15 additions & 0 deletions src/Solid/Exercicio03/Quadrado.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
18 changes: 18 additions & 0 deletions src/Solid/Exercicio03/Retangulo.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
7 changes: 7 additions & 0 deletions src/Solid/Exercicio04/Trabalhador.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package Solid.Exercicio04;

// Interface que viola o ISP
public interface Trabalhador {
void trabalhar();
void estudar();
}
5 changes: 5 additions & 0 deletions src/Solid/Exercicio04/TrabalhadorEstudo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package Solid.Exercicio04;

public interface TrabalhadorEstudo {
void estudar();
}
5 changes: 5 additions & 0 deletions src/Solid/Exercicio04/TrabalhadorTrabalho.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package Solid.Exercicio04;

public interface TrabalhadorTrabalho {
void trabalhar();
}
8 changes: 8 additions & 0 deletions src/Solid/Exercicio05/EmailService.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
14 changes: 14 additions & 0 deletions src/Solid/Exercicio05/Notificador.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
13 changes: 13 additions & 0 deletions src/Solid/Exercicio05/NotificadorRefatorado.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
5 changes: 5 additions & 0 deletions src/Solid/Exercicio05/ServicoNotificacao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package Solid.Exercicio05;

public interface ServicoNotificacao {
void enviarNotificacao(String destinatario, String mensagem);
}
41 changes: 41 additions & 0 deletions src/Solid/Exercicio06/LojaOnline.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
11 changes: 11 additions & 0 deletions src/Solid/Exercicio06/envio/EnvioCorreios.java
Original file line number Diff line number Diff line change
@@ -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
}
}
8 changes: 8 additions & 0 deletions src/Solid/Exercicio06/envio/ServicoEnvio.java
Original file line number Diff line number Diff line change
@@ -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);
}
6 changes: 6 additions & 0 deletions src/Solid/Exercicio06/pagamento/Pagamento.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package Solid.Exercicio06.pagamento;

// DIP: Interface de alto nível para pagamentos
public interface Pagamento {
boolean processarPagamento(double valor);
}
17 changes: 17 additions & 0 deletions src/Solid/Exercicio06/pagamento/PagamentoBoleto.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
19 changes: 19 additions & 0 deletions src/Solid/Exercicio06/pagamento/PagamentoCartaoCredito.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
38 changes: 38 additions & 0 deletions src/Solid/Exercicio06/pedido/Pedido.java
Original file line number Diff line number Diff line change
@@ -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<Produto> 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());
}
}
8 changes: 8 additions & 0 deletions src/Solid/Exercicio06/produto/Produto.java
Original file line number Diff line number Diff line change
@@ -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);
}
27 changes: 27 additions & 0 deletions src/Solid/Exercicio06/produto/ProdutoPadrao.java
Original file line number Diff line number Diff line change
@@ -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;
}
}