├── .gitignore ├── Abstract Factory ├── modulo-pagamento-abstract-factory │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── algaworks │ │ │ │ ├── gestorderisco │ │ │ │ ├── AlertaDeRiscoException.java │ │ │ │ ├── GestorDeRisco.java │ │ │ │ ├── clearsale │ │ │ │ │ └── ClearSale.java │ │ │ │ └── fcontrol │ │ │ │ │ └── FControl.java │ │ │ │ ├── operadora │ │ │ │ ├── CapturaNaoAutorizadaException.java │ │ │ │ ├── Operadora.java │ │ │ │ ├── cielo │ │ │ │ │ └── Cielo.java │ │ │ │ └── redecard │ │ │ │ │ └── Redecard.java │ │ │ │ └── pagamento │ │ │ │ ├── ModuloPagamentoFactory.java │ │ │ │ ├── Pagamento.java │ │ │ │ ├── pagseguro │ │ │ │ └── PagSeguroModuloPagamentoFactory.java │ │ │ │ └── paypal │ │ │ │ └── PayPalModuloPagamentoFactory.java │ │ └── resources │ │ │ └── .gitkeep │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── pagamento │ │ │ ├── PagamentoViaPagSeguroTest.java │ │ │ └── PagamentoViaPayPalTest.java │ │ └── resources │ │ └── .gitkeep └── modulo-pagamento-acoplado │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ ├── gestorderisco │ │ │ ├── AlertaDeRiscoException.java │ │ │ └── FControl.java │ │ │ ├── operadora │ │ │ ├── CapturaNaoAutorizadaException.java │ │ │ └── Cielo.java │ │ │ └── pagamento │ │ │ └── PagamentoPagSeguro.java │ └── resources │ │ └── .gitkeep │ └── test │ ├── java │ └── com │ │ └── algaworks │ │ └── pagamento │ │ └── PagamentoViaPagSeguroTest.java │ └── resources │ └── .gitkeep ├── Builder └── pedido-venda │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── model │ │ │ ├── Cliente.java │ │ │ ├── ItemPedido.java │ │ │ ├── PedidoVenda.java │ │ │ └── builder │ │ │ ├── PedidoVendaBuilder.java │ │ │ └── PedidoVendaBuilderValido.java │ └── resources │ │ └── .gitkeep │ └── test │ ├── java │ └── com │ │ └── algaworks │ │ └── model │ │ └── PedidoVendaTest.java │ └── resources │ └── .gitkeep ├── Decorator └── cobranca-cartao-credito │ └── src │ └── com │ └── algaworks │ └── cobranca │ ├── ExemploUso.java │ ├── exception │ └── RiscoCreditoException.java │ ├── model │ ├── CartaoCredito.java │ └── Cliente.java │ └── service │ ├── AnalisadorDeRiscoClearSale.java │ ├── AutorizadorCartaoCredito.java │ └── AutorizadorCielo.java ├── Dependency Injection └── pedido-venda-com-di │ ├── pom.xml │ ├── sabonete.xml │ └── src │ └── main │ ├── java │ └── com │ │ └── algaworks │ │ ├── Principal.java │ │ ├── bean │ │ ├── CalculadoraImposto.java │ │ ├── PedidoVendaService.java │ │ └── impl │ │ │ ├── CalculadoraImpostoImpl.java │ │ │ └── PedidoVendaServiceImpl.java │ │ ├── model │ │ └── PedidoVenda.java │ │ ├── repository │ │ ├── PedidosVendas.java │ │ └── xml │ │ │ └── XMLPedidosVendasRepository.java │ │ └── util │ │ └── cdi │ │ └── WeldContext.java │ └── resources │ └── META-INF │ └── beans.xml ├── Factory Method ├── maladireta-cliente │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── algaworks │ │ │ │ ├── NovoClienteCadastrado.java │ │ │ │ ├── RelacionamentoCliente.java │ │ │ │ └── maladireta │ │ │ │ ├── csv │ │ │ │ ├── ContatosCSV.java │ │ │ │ └── MalaDiretaCSV.java │ │ │ │ └── xml │ │ │ │ ├── ContatosXML.java │ │ │ │ └── MalaDiretaXML.java │ │ └── resources │ │ │ ├── contatos.csv │ │ │ └── contatos.xml │ │ └── test │ │ ├── java │ │ └── .gitignore │ │ └── resources │ │ └── .gitignore ├── maladireta-lib │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── algaworks │ │ │ │ ├── contato │ │ │ │ ├── Contato.java │ │ │ │ └── Contatos.java │ │ │ │ └── maladireta │ │ │ │ └── MalaDireta.java │ │ └── resources │ │ │ └── .gitignore │ │ └── test │ │ ├── java │ │ └── .gitkeep │ │ └── resources │ │ └── .gitkeep └── maladireta │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ ├── Principal.java │ │ │ ├── contato │ │ │ ├── Contato.java │ │ │ └── Contatos.java │ │ │ └── maladireta │ │ │ └── MalaDireta.java │ └── resources │ │ ├── .gitkeep │ │ ├── contatos.csv │ │ └── contatos.xml │ └── test │ ├── java │ └── .gitkeep │ └── resources │ └── .gitkeep ├── Observer ├── financeiro-sem-observer │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── algaworks │ │ │ ├── Principal.java │ │ │ ├── job │ │ │ └── LancamentosVencidosJob.java │ │ │ ├── model │ │ │ ├── Lancamento.java │ │ │ ├── Pessoa.java │ │ │ ├── TipoLancamento.java │ │ │ └── builder │ │ │ │ └── LancamentoBuilder.java │ │ │ ├── repository │ │ │ └── Lancamentos.java │ │ │ └── senders │ │ │ ├── EnviadorEmail.java │ │ │ └── EnviadorSMS.java │ │ └── test │ │ ├── java │ │ └── .gitkeep │ │ └── resources │ │ └── .gitkeep └── financeiro │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ ├── Principal.java │ │ │ ├── job │ │ │ └── LancamentosVencidosJob.java │ │ │ ├── listeners │ │ │ ├── EmailListener.java │ │ │ ├── Listener.java │ │ │ └── SMSListener.java │ │ │ ├── model │ │ │ ├── Lancamento.java │ │ │ ├── Pessoa.java │ │ │ ├── TipoLancamento.java │ │ │ └── builder │ │ │ │ └── LancamentoBuilder.java │ │ │ ├── notifier │ │ │ ├── Notificador.java │ │ │ └── NotificadorLancamentosVencidos.java │ │ │ └── repository │ │ │ └── Lancamentos.java │ └── resources │ │ └── .gitkeep │ └── test │ ├── java │ └── .gitkeep │ └── resources │ └── .gitkeep ├── Proxy ├── carregar-contatos-com-proxy │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── algaworks │ │ │ │ ├── contatos │ │ │ │ └── ContatosXML.java │ │ │ │ ├── model │ │ │ │ └── Contato.java │ │ │ │ └── repository │ │ │ │ └── Contatos.java │ │ └── resources │ │ │ ├── contatos1.xml │ │ │ └── contatos2.xml │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── contatos │ │ │ ├── ContatosXMLProxy.java │ │ │ └── ContatosXMLTest.java │ │ └── resources │ │ └── .gitkeep └── carregar-contatos-sem-padrao-proxy │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ ├── BuscaContato.java │ │ │ ├── contatos │ │ │ └── ContatosXML.java │ │ │ ├── model │ │ │ └── Contato.java │ │ │ └── repository │ │ │ └── Contatos.java │ └── resources │ │ ├── contatos1.xml │ │ └── contatos2.xml │ └── test │ ├── java │ └── .gitkeep │ └── resources │ └── .gitkeep ├── README.md └── Strategy ├── transportadora-com-strategy └── src │ └── com │ └── algaworks │ └── transportadora │ ├── Exemplo.java │ └── service │ ├── Frete.java │ ├── TipoFrete.java │ └── frete │ ├── Normal.java │ └── Sedex.java └── transportadora-sem-strategy └── src └── com └── algaworks └── transportadora ├── Exemplo.java └── service ├── Frete.java └── TipoFrete.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | .DS_Store 3 | .metadata 4 | .settings 5 | .classpath 6 | .project 7 | target/ 8 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | modulo-pagamento-abstract-factory 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | junit 30 | junit 31 | 4.11 32 | test 33 | 34 | 35 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/gestorderisco/AlertaDeRiscoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco; 2 | 3 | public class AlertaDeRiscoException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public AlertaDeRiscoException(String msg) { 8 | super(msg); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/gestorderisco/GestorDeRisco.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public interface GestorDeRisco { 6 | 7 | public void avaliarRisco(String cartao, BigDecimal valor) throws AlertaDeRiscoException; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/gestorderisco/clearsale/ClearSale.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco.clearsale; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 6 | import com.algaworks.gestorderisco.GestorDeRisco; 7 | 8 | public class ClearSale implements GestorDeRisco { 9 | 10 | @Override 11 | public void avaliarRisco(String cartao, BigDecimal valor) throws AlertaDeRiscoException { 12 | if (cartao.startsWith("1111") && valorMuitoAlto(valor)) { 13 | throw new AlertaDeRiscoException("Valor muito alto para esse cartão"); 14 | } 15 | } 16 | 17 | private boolean valorMuitoAlto(BigDecimal valor) { 18 | BigDecimal limite = new BigDecimal("5000"); 19 | return limite.compareTo(valor) < 0; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/gestorderisco/fcontrol/FControl.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco.fcontrol; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 6 | import com.algaworks.gestorderisco.GestorDeRisco; 7 | 8 | public class FControl implements GestorDeRisco { 9 | 10 | @Override 11 | public void avaliarRisco(String cartao, BigDecimal valor) throws AlertaDeRiscoException { 12 | if (cartao.startsWith("7777")) { 13 | throw new AlertaDeRiscoException("Cartão suspeito."); 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/operadora/CapturaNaoAutorizadaException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora; 2 | 3 | public class CapturaNaoAutorizadaException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public CapturaNaoAutorizadaException(String msg) { 8 | super(msg); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/operadora/Operadora.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public interface Operadora { 6 | 7 | public void capturar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException; 8 | public Long confirmar(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/operadora/cielo/Cielo.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora.cielo; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 6 | import com.algaworks.operadora.Operadora; 7 | 8 | public class Cielo implements Operadora { 9 | 10 | private Long codigoConfirmacao = -1L; 11 | 12 | @Override 13 | public void capturar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException { 14 | if (cartao.startsWith("5555")) { 15 | throw new CapturaNaoAutorizadaException("Número de cartão inválido!"); 16 | } 17 | 18 | this.codigoConfirmacao = (long) Math.random() * 1000; 19 | } 20 | 21 | @Override 22 | public Long confirmar() { 23 | System.out.println("Fazendo o débito na conta do cliente via Cielo"); 24 | return this.codigoConfirmacao; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/operadora/redecard/Redecard.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora.redecard; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 6 | import com.algaworks.operadora.Operadora; 7 | 8 | public class Redecard implements Operadora { 9 | 10 | private Long codigoConfirmacao = -1L; 11 | 12 | @Override 13 | public void capturar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException { 14 | if (cartao.startsWith("2222") && valorMaiorQueLimite(valor)) { 15 | throw new CapturaNaoAutorizadaException("Valor maior que limite para cartão informado."); 16 | } 17 | 18 | this.codigoConfirmacao = (long) Math.random() * 300; 19 | } 20 | 21 | private boolean valorMaiorQueLimite(BigDecimal valor) { 22 | BigDecimal limite = new BigDecimal("1000"); 23 | return valor.compareTo(limite) > 0; 24 | } 25 | 26 | @Override 27 | public Long confirmar() { 28 | System.out.println("Fazendo o débito na conta do cliente via Redecard"); 29 | return this.codigoConfirmacao; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/pagamento/ModuloPagamentoFactory.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import com.algaworks.gestorderisco.GestorDeRisco; 4 | import com.algaworks.operadora.Operadora; 5 | 6 | public interface ModuloPagamentoFactory { 7 | 8 | public Operadora criarOperadora(); 9 | public GestorDeRisco criarGestorDeRisco(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/pagamento/Pagamento.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 6 | import com.algaworks.gestorderisco.GestorDeRisco; 7 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 8 | import com.algaworks.operadora.Operadora; 9 | 10 | public class Pagamento { 11 | 12 | private Operadora operadora; 13 | private GestorDeRisco gestorDeRisco; 14 | 15 | public Pagamento(ModuloPagamentoFactory moduloPagamentoFactory) { 16 | this.operadora = moduloPagamentoFactory.criarOperadora(); 17 | this.gestorDeRisco = moduloPagamentoFactory.criarGestorDeRisco(); 18 | } 19 | 20 | public Long autorizar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 21 | this.operadora.capturar(cartao, valor); 22 | this.gestorDeRisco.avaliarRisco(cartao, valor); 23 | return this.operadora.confirmar(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/pagamento/pagseguro/PagSeguroModuloPagamentoFactory.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento.pagseguro; 2 | 3 | import com.algaworks.gestorderisco.GestorDeRisco; 4 | import com.algaworks.gestorderisco.fcontrol.FControl; 5 | import com.algaworks.operadora.Operadora; 6 | import com.algaworks.operadora.cielo.Cielo; 7 | import com.algaworks.pagamento.ModuloPagamentoFactory; 8 | 9 | public class PagSeguroModuloPagamentoFactory implements ModuloPagamentoFactory { 10 | 11 | @Override 12 | public Operadora criarOperadora() { 13 | return new Cielo(); 14 | } 15 | 16 | @Override 17 | public GestorDeRisco criarGestorDeRisco() { 18 | return new FControl(); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/java/com/algaworks/pagamento/paypal/PayPalModuloPagamentoFactory.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento.paypal; 2 | 3 | import com.algaworks.gestorderisco.GestorDeRisco; 4 | import com.algaworks.gestorderisco.clearsale.ClearSale; 5 | import com.algaworks.operadora.Operadora; 6 | import com.algaworks.operadora.redecard.Redecard; 7 | import com.algaworks.pagamento.ModuloPagamentoFactory; 8 | 9 | public class PayPalModuloPagamentoFactory implements ModuloPagamentoFactory { 10 | 11 | @Override 12 | public Operadora criarOperadora() { 13 | return new Redecard(); 14 | } 15 | 16 | @Override 17 | public GestorDeRisco criarGestorDeRisco() { 18 | return new ClearSale(); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/main/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Abstract Factory/modulo-pagamento-abstract-factory/src/main/resources/.gitkeep -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/test/java/com/algaworks/pagamento/PagamentoViaPagSeguroTest.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import static org.junit.Assert.assertNotNull; 4 | 5 | import java.math.BigDecimal; 6 | 7 | import org.junit.Before; 8 | import org.junit.Test; 9 | 10 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 11 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 12 | import com.algaworks.pagamento.pagseguro.PagSeguroModuloPagamentoFactory; 13 | 14 | public class PagamentoViaPagSeguroTest { 15 | 16 | private Pagamento pagamento; 17 | 18 | @Before 19 | public void init() { 20 | ModuloPagamentoFactory moduloPagamentoFactory = new PagSeguroModuloPagamentoFactory(); 21 | pagamento = new Pagamento(moduloPagamentoFactory); 22 | } 23 | 24 | @Test 25 | public void deveAutorizarVenda() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 26 | Long codigoAutorizacao = pagamento.autorizar("2222.2222", new BigDecimal("200")); 27 | assertNotNull(codigoAutorizacao); 28 | } 29 | 30 | @Test(expected=CapturaNaoAutorizadaException.class) 31 | public void deveNegarCaptura_cartaoInvalido() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 32 | pagamento.autorizar("5555.2222", new BigDecimal("2000")); 33 | } 34 | 35 | @Test(expected=AlertaDeRiscoException.class) 36 | public void deveGerarAlertaDeRisco() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 37 | pagamento.autorizar("7777.2222", new BigDecimal("5500")); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/test/java/com/algaworks/pagamento/PagamentoViaPayPalTest.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import static org.junit.Assert.assertNotNull; 4 | 5 | import java.math.BigDecimal; 6 | 7 | import org.junit.Before; 8 | import org.junit.Test; 9 | 10 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 11 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 12 | import com.algaworks.pagamento.paypal.PayPalModuloPagamentoFactory; 13 | 14 | public class PagamentoViaPayPalTest { 15 | 16 | private Pagamento pagamento; 17 | 18 | @Before 19 | public void init() { 20 | ModuloPagamentoFactory moduloPagamentoFactory = new PayPalModuloPagamentoFactory(); 21 | pagamento = new Pagamento(moduloPagamentoFactory); 22 | } 23 | 24 | @Test 25 | public void deveAutorizarVenda() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 26 | Long codigoAutorizacao = pagamento.autorizar("2222.2222", new BigDecimal("200")); 27 | assertNotNull(codigoAutorizacao); 28 | } 29 | 30 | @Test(expected = CapturaNaoAutorizadaException.class) 31 | public void deveNegarCaptura_valorAcimaDoLimiteParaCartao() throws CapturaNaoAutorizadaException, 32 | AlertaDeRiscoException { 33 | pagamento.autorizar("2222.2222", new BigDecimal("2000")); 34 | } 35 | 36 | @Test 37 | public void deveAutorizarVenda_valorAltoComCartaoValido() throws CapturaNaoAutorizadaException, 38 | AlertaDeRiscoException { 39 | Long codigoAutorizacao = pagamento.autorizar("3333.2222", new BigDecimal("2000")); 40 | assertNotNull(codigoAutorizacao); 41 | } 42 | 43 | @Test(expected = AlertaDeRiscoException.class) 44 | public void deveGerarAlertaDeRisco() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 45 | pagamento.autorizar("1111.2222", new BigDecimal("5500")); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-abstract-factory/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Abstract Factory/modulo-pagamento-abstract-factory/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | modulo-pagamento-acoplado 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | junit 30 | junit 31 | 4.11 32 | test 33 | 34 | 35 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/java/com/algaworks/gestorderisco/AlertaDeRiscoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco; 2 | 3 | public class AlertaDeRiscoException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public AlertaDeRiscoException(String msg) { 8 | super(msg); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/java/com/algaworks/gestorderisco/FControl.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.gestorderisco; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class FControl { 6 | 7 | public void avaliarRisco(String cartao, BigDecimal valor) throws AlertaDeRiscoException { 8 | if (cartao.startsWith("7777")) { 9 | throw new AlertaDeRiscoException("Cartão suspeito."); 10 | } 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/java/com/algaworks/operadora/CapturaNaoAutorizadaException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora; 2 | 3 | public class CapturaNaoAutorizadaException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public CapturaNaoAutorizadaException(String msg) { 8 | super(msg); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/java/com/algaworks/operadora/Cielo.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.operadora; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class Cielo { 6 | 7 | private Long codigoConfirmacao = -1L; 8 | 9 | public void capturar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException { 10 | if (cartao.startsWith("5555")) { 11 | throw new CapturaNaoAutorizadaException("Número de cartão inválido!"); 12 | } 13 | 14 | this.codigoConfirmacao = (long) Math.random() * 1000; 15 | } 16 | 17 | public Long confirmar() { 18 | System.out.println("Fazendo o débito na conta do cliente via Cielo"); 19 | return this.codigoConfirmacao; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/java/com/algaworks/pagamento/PagamentoPagSeguro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 6 | import com.algaworks.gestorderisco.FControl; 7 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 8 | import com.algaworks.operadora.Cielo; 9 | 10 | public class PagamentoPagSeguro { 11 | 12 | private Cielo operadora; 13 | private FControl gestorDeRisco; 14 | 15 | public PagamentoPagSeguro(Cielo operadora, FControl gestorDeRisco) { 16 | this.operadora = operadora; 17 | this.gestorDeRisco = gestorDeRisco; 18 | } 19 | 20 | public Long autorizar(String cartao, BigDecimal valor) throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 21 | this.operadora.capturar(cartao, valor); 22 | this.gestorDeRisco.avaliarRisco(cartao, valor); 23 | return this.operadora.confirmar(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/main/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Abstract Factory/modulo-pagamento-acoplado/src/main/resources/.gitkeep -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/test/java/com/algaworks/pagamento/PagamentoViaPagSeguroTest.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.pagamento; 2 | 3 | import static org.junit.Assert.assertNotNull; 4 | 5 | import java.math.BigDecimal; 6 | 7 | import org.junit.Before; 8 | import org.junit.Test; 9 | 10 | import com.algaworks.gestorderisco.AlertaDeRiscoException; 11 | import com.algaworks.gestorderisco.FControl; 12 | import com.algaworks.operadora.CapturaNaoAutorizadaException; 13 | import com.algaworks.operadora.Cielo; 14 | 15 | public class PagamentoViaPagSeguroTest { 16 | 17 | private PagamentoPagSeguro pagamento; 18 | 19 | @Before 20 | public void init() { 21 | Cielo cielo = new Cielo(); 22 | FControl fcontrol = new FControl(); 23 | pagamento = new PagamentoPagSeguro(cielo, fcontrol); 24 | } 25 | 26 | @Test 27 | public void deveAutorizarVenda() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 28 | Long codigoAutorizacao = pagamento.autorizar("2222.2222", new BigDecimal("200")); 29 | assertNotNull(codigoAutorizacao); 30 | } 31 | 32 | @Test(expected=CapturaNaoAutorizadaException.class) 33 | public void deveNegarCaptura_cartaoInvalido() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 34 | pagamento.autorizar("5555.2222", new BigDecimal("2000")); 35 | } 36 | 37 | @Test(expected=AlertaDeRiscoException.class) 38 | public void deveGerarAlertaDeRisco() throws CapturaNaoAutorizadaException, AlertaDeRiscoException { 39 | pagamento.autorizar("7777.2222", new BigDecimal("5500")); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Abstract Factory/modulo-pagamento-acoplado/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Abstract Factory/modulo-pagamento-acoplado/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Builder/pedido-venda/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks.pedidovenda 7 | pedido-venda 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | junit 31 | junit 32 | 4.11 33 | test 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/java/com/algaworks/model/Cliente.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | public class Cliente { 4 | 5 | private String nome; 6 | private boolean vip; 7 | 8 | public String getNome() { 9 | return nome; 10 | } 11 | 12 | public void setNome(String nome) { 13 | this.nome = nome; 14 | } 15 | 16 | public boolean isVip() { 17 | return vip; 18 | } 19 | 20 | public void setVip(boolean vip) { 21 | this.vip = vip; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/java/com/algaworks/model/ItemPedido.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class ItemPedido { 6 | 7 | private String nome; 8 | private Integer quantidade; 9 | private BigDecimal valorUnitario; 10 | 11 | public String getNome() { 12 | return nome; 13 | } 14 | 15 | public void setNome(String nome) { 16 | this.nome = nome; 17 | } 18 | 19 | public Integer getQuantidade() { 20 | return quantidade; 21 | } 22 | 23 | public void setQuantidade(Integer quantidade) { 24 | this.quantidade = quantidade; 25 | } 26 | 27 | public BigDecimal getValorUnitario() { 28 | return valorUnitario; 29 | } 30 | 31 | public void setValorUnitario(BigDecimal valorUnitario) { 32 | this.valorUnitario = valorUnitario; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/java/com/algaworks/model/PedidoVenda.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.List; 5 | 6 | public class PedidoVenda { 7 | 8 | private String numero; 9 | private Cliente cliente; 10 | private List itensPedido; 11 | 12 | public String getNumero() { 13 | return numero; 14 | } 15 | 16 | public void setNumero(String numero) { 17 | this.numero = numero; 18 | } 19 | 20 | public Cliente getCliente() { 21 | return cliente; 22 | } 23 | 24 | public void setCliente(Cliente cliente) { 25 | this.cliente = cliente; 26 | } 27 | 28 | public List getItensPedido() { 29 | return itensPedido; 30 | } 31 | 32 | public void setItensPedido(List itensPedido) { 33 | this.itensPedido = itensPedido; 34 | } 35 | 36 | public BigDecimal getValorTotal() { 37 | BigDecimal valorTotal = BigDecimal.ZERO; 38 | for (ItemPedido item : itensPedido) { 39 | valorTotal = valorTotal.add(item.getValorUnitario().multiply(new BigDecimal(item.getQuantidade()))); 40 | } 41 | 42 | // Se cliente vip dar 4% de desconto 43 | if (cliente.isVip()) { 44 | valorTotal = valorTotal.multiply(new BigDecimal("0.96")); 45 | } 46 | 47 | return valorTotal; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/java/com/algaworks/model/builder/PedidoVendaBuilder.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model.builder; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.ArrayList; 5 | 6 | import com.algaworks.model.Cliente; 7 | import com.algaworks.model.ItemPedido; 8 | import com.algaworks.model.PedidoVenda; 9 | 10 | public class PedidoVendaBuilder { 11 | 12 | private PedidoVenda instancia; 13 | 14 | public PedidoVendaBuilder() { 15 | this.instancia = new PedidoVenda(); 16 | } 17 | 18 | public PedidoVendaBuilder comClienteVip(String nome) { 19 | definirCliente(nome, true); 20 | return this; 21 | } 22 | 23 | public PedidoVendaBuilder comClienteNormal(String nome) { 24 | definirCliente(nome, false); 25 | return this; 26 | } 27 | 28 | private void definirCliente(String nome, boolean vip) { 29 | Cliente cliente = new Cliente(); 30 | cliente.setNome(nome); 31 | cliente.setVip(true); 32 | this.instancia.setCliente(cliente); 33 | } 34 | 35 | public PedidoVendaBuilder comItem(String nome, Integer quantidade, String valorUnitario) { 36 | ItemPedido item = new ItemPedido(); 37 | item.setNome(nome); 38 | item.setValorUnitario(new BigDecimal(valorUnitario)); 39 | item.setQuantidade(quantidade); 40 | 41 | if (this.instancia.getItensPedido() == null) { 42 | this.instancia.setItensPedido(new ArrayList()); 43 | } 44 | 45 | this.instancia.getItensPedido().add(item); 46 | 47 | return this; 48 | } 49 | 50 | public PedidoVendaBuilderValido comNumero(String numero) { 51 | this.instancia.setNumero(numero); 52 | return new PedidoVendaBuilderValido(instancia); 53 | } 54 | 55 | } 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/java/com/algaworks/model/builder/PedidoVendaBuilderValido.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model.builder; 2 | 3 | import com.algaworks.model.PedidoVenda; 4 | 5 | public class PedidoVendaBuilderValido { 6 | 7 | private PedidoVenda instancia; 8 | 9 | public PedidoVendaBuilderValido(PedidoVenda instancia) { 10 | this.instancia = instancia; 11 | } 12 | 13 | public PedidoVenda construir() { 14 | return this.instancia; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/main/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Builder/pedido-venda/src/main/resources/.gitkeep -------------------------------------------------------------------------------- /Builder/pedido-venda/src/test/java/com/algaworks/model/PedidoVendaTest.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import java.math.BigDecimal; 6 | import java.util.Arrays; 7 | import java.util.List; 8 | 9 | import org.junit.Test; 10 | 11 | import com.algaworks.model.builder.PedidoVendaBuilder; 12 | 13 | public class PedidoVendaTest { 14 | 15 | @Test 16 | public void deveCalcularValorTotalPedidoParaClienteVip() { 17 | PedidoVenda pedidoVenda = new PedidoVenda(); 18 | 19 | Cliente cliente = new Cliente(); 20 | cliente.setNome("João"); 21 | cliente.setVip(true); 22 | pedidoVenda.setCliente(cliente); 23 | 24 | ItemPedido item1 = new ItemPedido(); 25 | item1.setNome("Calculadora"); 26 | item1.setValorUnitario(new BigDecimal("200")); 27 | item1.setQuantidade(2); 28 | 29 | ItemPedido item2 = new ItemPedido(); 30 | item2.setNome("Mochila"); 31 | item2.setValorUnitario(new BigDecimal("200")); 32 | item2.setQuantidade(1); 33 | 34 | List itensPedido = Arrays.asList(item1, item2); 35 | pedidoVenda.setItensPedido(itensPedido); 36 | 37 | BigDecimal valorTotal = pedidoVenda.getValorTotal(); 38 | 39 | assertEquals(new BigDecimal("576").doubleValue(), valorTotal.doubleValue(), 0.0001); 40 | } 41 | 42 | @Test 43 | public void deveCalcularValorTotalPedidoParaClienteVipComBuilder() { 44 | PedidoVenda pedidoVenda = new PedidoVendaBuilder() 45 | .comClienteVip("João Silva") 46 | .comItem("Calculadora", 2, "200") 47 | .comItem("Mochila", 1, "200") 48 | .comNumero("02020") 49 | .construir(); 50 | 51 | BigDecimal valorTotal = pedidoVenda.getValorTotal(); 52 | 53 | assertEquals(new BigDecimal("576").doubleValue(), valorTotal.doubleValue(), 0.0001); 54 | } 55 | 56 | } 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /Builder/pedido-venda/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Builder/pedido-venda/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/ExemploUso.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca; 2 | 3 | import java.time.YearMonth; 4 | import java.util.Scanner; 5 | 6 | import com.algaworks.cobranca.model.CartaoCredito; 7 | import com.algaworks.cobranca.model.Cliente; 8 | import com.algaworks.cobranca.service.AnalisadorDeRiscoClearSale; 9 | import com.algaworks.cobranca.service.AutorizadorCartaoCredito; 10 | import com.algaworks.cobranca.service.AutorizadorCielo; 11 | 12 | public class ExemploUso { 13 | 14 | public static void main(String[] args) { 15 | try (Scanner entrada = new Scanner(System.in)) { 16 | System.out.printf("Cliente: "); 17 | String nomeCliente = entrada.nextLine(); 18 | 19 | System.out.printf("CPF: "); 20 | String cpf = entrada.nextLine(); 21 | 22 | System.out.println(); 23 | System.out.printf("Valor da compra: R$"); 24 | double valor = entrada.nextDouble(); 25 | entrada.nextLine(); 26 | 27 | System.out.println(); 28 | System.out.println("Informações de pagamento"); 29 | System.out.printf("Número do cartão: "); 30 | String cartao = entrada.nextLine(); 31 | System.out.printf("Nome do cartão: "); 32 | String nomeCartao = entrada.nextLine(); 33 | System.out.printf("Ano vencimento: "); 34 | int anoVencimento = entrada.nextInt(); 35 | System.out.printf("Mês vencimento: "); 36 | int mesVencimento = entrada.nextInt(); 37 | System.out.printf("Código segurança: "); 38 | int codigoSeguranca = entrada.nextInt(); 39 | 40 | Cliente cliente = new Cliente(nomeCliente, cpf); 41 | CartaoCredito cartaoCredito = new CartaoCredito(cartao, nomeCartao, 42 | YearMonth.of(anoVencimento, mesVencimento), codigoSeguranca); 43 | 44 | AutorizadorCartaoCredito autorizador = new AnalisadorDeRiscoClearSale(new AutorizadorCielo()); 45 | autorizador.autorizar(cliente, cartaoCredito, valor); 46 | } 47 | 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/exception/RiscoCreditoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.exception; 2 | 3 | public class RiscoCreditoException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public RiscoCreditoException(String msg) { 8 | super(msg); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/model/CartaoCredito.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.model; 2 | 3 | import java.time.YearMonth; 4 | 5 | public class CartaoCredito { 6 | 7 | private String numero; 8 | private String nome; 9 | private YearMonth vencimento; 10 | private int codigoSeguranca; 11 | 12 | public CartaoCredito(String numero, String nome, YearMonth vencimento, 13 | int codigoSeguranca) { 14 | this.numero = numero; 15 | this.nome = nome; 16 | this.vencimento = vencimento; 17 | this.codigoSeguranca = codigoSeguranca; 18 | } 19 | 20 | public String getNumero() { 21 | return numero; 22 | } 23 | 24 | public void setNumero(String numero) { 25 | this.numero = numero; 26 | } 27 | 28 | public String getNome() { 29 | return nome; 30 | } 31 | 32 | public void setNome(String nome) { 33 | this.nome = nome; 34 | } 35 | 36 | public YearMonth getVencimento() { 37 | return vencimento; 38 | } 39 | 40 | public void setVencimento(YearMonth vencimento) { 41 | this.vencimento = vencimento; 42 | } 43 | 44 | public int getCodigoSeguranca() { 45 | return codigoSeguranca; 46 | } 47 | 48 | public void setCodigoSeguranca(int codigoSeguranca) { 49 | this.codigoSeguranca = codigoSeguranca; 50 | } 51 | 52 | @Override 53 | public String toString() { 54 | return "CartaoCredito [numero=" + numero + ", nome=" + nome 55 | + ", vencimento=" + vencimento + ", codigoSeguranca=" 56 | + codigoSeguranca + "]"; 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/model/Cliente.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.model; 2 | 3 | public class Cliente { 4 | 5 | private String nome; 6 | private String cpf; 7 | 8 | public Cliente(String nome, String cpf) { 9 | this.nome = nome; 10 | this.cpf = cpf; 11 | } 12 | 13 | public String getNome() { 14 | return nome; 15 | } 16 | 17 | public void setNome(String nome) { 18 | this.nome = nome; 19 | } 20 | 21 | public String getCpf() { 22 | return cpf; 23 | } 24 | 25 | public void setCpf(String cpf) { 26 | this.cpf = cpf; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return "Cliente [nome=" + nome + ", cpf=" + cpf + "]"; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/service/AnalisadorDeRiscoClearSale.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.service; 2 | 3 | import java.time.YearMonth; 4 | 5 | import com.algaworks.cobranca.exception.RiscoCreditoException; 6 | import com.algaworks.cobranca.model.CartaoCredito; 7 | import com.algaworks.cobranca.model.Cliente; 8 | 9 | public class AnalisadorDeRiscoClearSale implements AutorizadorCartaoCredito { 10 | 11 | private AutorizadorCartaoCredito autorizador; 12 | 13 | public AnalisadorDeRiscoClearSale(AutorizadorCartaoCredito autorizador) { 14 | this.autorizador = autorizador; 15 | } 16 | 17 | @Override 18 | public void autorizar(Cliente cliente, CartaoCredito cartaoCredito, double valor) { 19 | if (cliente.getCpf().startsWith("111") || cartaoCredito.getVencimento().isBefore(YearMonth.now()) 20 | || valor > 500) { 21 | throw new RiscoCreditoException("Possível fraude, negando pagamento!"); 22 | } 23 | 24 | autorizador.autorizar(cliente, cartaoCredito, valor); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/service/AutorizadorCartaoCredito.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.service; 2 | 3 | import com.algaworks.cobranca.model.CartaoCredito; 4 | import com.algaworks.cobranca.model.Cliente; 5 | 6 | public interface AutorizadorCartaoCredito { 7 | 8 | public void autorizar(Cliente cliente, CartaoCredito cartaoCredito, double valor); 9 | 10 | } -------------------------------------------------------------------------------- /Decorator/cobranca-cartao-credito/src/com/algaworks/cobranca/service/AutorizadorCielo.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.cobranca.service; 2 | 3 | import java.io.FileNotFoundException; 4 | import java.io.FileOutputStream; 5 | import java.io.PrintStream; 6 | 7 | import com.algaworks.cobranca.model.CartaoCredito; 8 | import com.algaworks.cobranca.model.Cliente; 9 | 10 | public class AutorizadorCielo implements AutorizadorCartaoCredito { 11 | 12 | @Override 13 | public void autorizar(Cliente cliente, CartaoCredito cartaoCredito, double valor) { 14 | try (PrintStream writer = new PrintStream(new FileOutputStream("debitos.txt", true))) { 15 | writer.println(cliente + " | " + cartaoCredito + " | R$" + valor); 16 | } catch (FileNotFoundException e) { 17 | throw new RuntimeException("Impossível salvar arquivo", e); 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | pedido-venda-com-di 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | org.jboss.weld.se 31 | weld-se 32 | 2.2.2.Final 33 | 34 | 35 | 36 | 37 | com.thoughtworks.xstream 38 | xstream 39 | 1.4.7 40 | 41 | 42 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/sabonete.xml: -------------------------------------------------------------------------------- 1 | 2 | sabonete 3 | 3.00 4 | 0.4500 5 | 2014-07-07 14:55:38.524 UTC 6 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/Principal.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.bean.PedidoVendaService; 6 | import com.algaworks.model.PedidoVenda; 7 | import com.algaworks.util.cdi.WeldContext; 8 | 9 | public class Principal { 10 | 11 | public static void main(String[] args) { 12 | PedidoVendaService service = WeldContext.INSTANCE.getBean(PedidoVendaService.class); 13 | PedidoVenda pedidoVenda = new PedidoVenda("sabonete", new BigDecimal("3.00")); 14 | 15 | service.salvar(pedidoVenda); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/bean/CalculadoraImposto.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.bean; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public interface CalculadoraImposto { 6 | 7 | public BigDecimal calcular(BigDecimal valor); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/bean/PedidoVendaService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.bean; 2 | 3 | import com.algaworks.model.PedidoVenda; 4 | 5 | public interface PedidoVendaService { 6 | 7 | public void salvar(PedidoVenda pedidoVenda); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/bean/impl/CalculadoraImpostoImpl.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.bean.impl; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import com.algaworks.bean.CalculadoraImposto; 6 | 7 | public class CalculadoraImpostoImpl implements CalculadoraImposto { 8 | 9 | @Override 10 | public BigDecimal calcular(BigDecimal valor) { 11 | return valor.multiply(new BigDecimal("0.15")); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/bean/impl/PedidoVendaServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.bean.impl; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | import javax.inject.Inject; 7 | 8 | import com.algaworks.bean.CalculadoraImposto; 9 | import com.algaworks.bean.PedidoVendaService; 10 | import com.algaworks.model.PedidoVenda; 11 | import com.algaworks.repository.PedidosVendas; 12 | 13 | public class PedidoVendaServiceImpl implements PedidoVendaService { 14 | 15 | @Inject 16 | private PedidosVendas pedidosVendas; 17 | 18 | @Inject 19 | private CalculadoraImposto calculadoraImposto; 20 | 21 | @Override 22 | public void salvar(PedidoVenda pedidoVenda) { 23 | pedidoVenda.setData(new Date()); 24 | 25 | BigDecimal imposto = calculadoraImposto.calcular(pedidoVenda.getValor()); 26 | pedidoVenda.setImposto(imposto); 27 | 28 | pedidosVendas.salvar(pedidoVenda); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/model/PedidoVenda.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | public class PedidoVenda { 7 | 8 | private String descricao; 9 | private BigDecimal valor; 10 | private BigDecimal imposto; 11 | private Date data; 12 | 13 | public PedidoVenda(String descricao, BigDecimal valor) { 14 | this.descricao = descricao; 15 | this.valor = valor; 16 | } 17 | 18 | public String getDescricao() { 19 | return descricao; 20 | } 21 | 22 | public void setDescricao(String descricao) { 23 | this.descricao = descricao; 24 | } 25 | 26 | public BigDecimal getValor() { 27 | return valor; 28 | } 29 | 30 | public void setValor(BigDecimal valor) { 31 | this.valor = valor; 32 | } 33 | 34 | public BigDecimal getImposto() { 35 | return imposto; 36 | } 37 | 38 | public void setImposto(BigDecimal imposto) { 39 | this.imposto = imposto; 40 | } 41 | 42 | public Date getData() { 43 | return data; 44 | } 45 | 46 | public void setData(Date data) { 47 | this.data = data; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/repository/PedidosVendas.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository; 2 | 3 | import com.algaworks.model.PedidoVenda; 4 | 5 | public interface PedidosVendas { 6 | 7 | public void salvar(PedidoVenda pedidoVenda); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/repository/xml/XMLPedidosVendasRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository.xml; 2 | 3 | import java.io.FileNotFoundException; 4 | import java.io.FileOutputStream; 5 | import java.io.OutputStream; 6 | 7 | import com.algaworks.model.PedidoVenda; 8 | import com.algaworks.repository.PedidosVendas; 9 | import com.thoughtworks.xstream.XStream; 10 | 11 | public class XMLPedidosVendasRepository implements PedidosVendas { 12 | 13 | @Override 14 | public void salvar(PedidoVenda pedidoVenda) { 15 | XStream xstream = new XStream(); 16 | xstream.alias("pedido-venda", PedidoVenda.class); 17 | OutputStream out = null; 18 | try { 19 | out = new FileOutputStream(pedidoVenda.getDescricao() + ".xml"); 20 | xstream.toXML(pedidoVenda, out); 21 | } catch (FileNotFoundException e) { 22 | throw new RuntimeException("Erro salvando arquivo", e); 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/java/com/algaworks/util/cdi/WeldContext.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.util.cdi; 2 | 3 | import org.jboss.weld.environment.se.Weld; 4 | import org.jboss.weld.environment.se.WeldContainer; 5 | 6 | public class WeldContext { 7 | 8 | public static final WeldContext INSTANCE = new WeldContext(); 9 | 10 | private final Weld weld; 11 | private final WeldContainer container; 12 | 13 | private WeldContext() { 14 | this.weld = new Weld(); 15 | this.container = weld.initialize(); 16 | } 17 | 18 | public T getBean(Class type) { 19 | return container.instance().select(type).get(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Dependency Injection/pedido-venda-com-di/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | maladireta-cliente 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | com.algaworks 31 | maladireta-lib 32 | 1.0.0-SNAPSHOT 33 | 34 | 35 | 36 | 37 | com.thoughtworks.xstream 38 | xstream 39 | 1.4.7 40 | 41 | 42 | 43 | 44 | net.sf.opencsv 45 | opencsv 46 | 2.3 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/NovoClienteCadastrado.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import javax.swing.JOptionPane; 4 | 5 | import com.algaworks.maladireta.xml.MalaDiretaXML; 6 | import com.algaworks.maladireta.MalaDireta; 7 | 8 | public class NovoClienteCadastrado { 9 | 10 | public static void main(String[] args) { 11 | MalaDireta malaDireta = new MalaDiretaXML("contatos.xml"); 12 | String mensagem = JOptionPane.showInputDialog(null, "Informe a mensagem de novo cliente:"); 13 | boolean status = malaDireta.enviarEmail(mensagem); 14 | JOptionPane.showMessageDialog(null, "E-mails enviados: " + status); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/RelacionamentoCliente.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import javax.swing.JOptionPane; 4 | 5 | import com.algaworks.maladireta.MalaDireta; 6 | import com.algaworks.maladireta.csv.MalaDiretaCSV; 7 | 8 | public class RelacionamentoCliente { 9 | 10 | public static void main(String[] args) { 11 | MalaDireta malaDireta = new MalaDiretaCSV("contatos.csv"); 12 | String mensagem = JOptionPane.showInputDialog(null, "Digite a mensagem do e-mail:"); 13 | 14 | boolean status = malaDireta.enviarEmail(mensagem); 15 | 16 | JOptionPane.showConfirmDialog(null, "E-mails enviados: " + status); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/maladireta/csv/ContatosCSV.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta.csv; 2 | 3 | import java.io.File; 4 | import java.io.FileReader; 5 | import java.io.IOException; 6 | import java.net.URI; 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | import au.com.bytecode.opencsv.CSVReader; 11 | 12 | import com.algaworks.contato.Contato; 13 | import com.algaworks.contato.Contatos; 14 | 15 | public class ContatosCSV implements Contatos { 16 | 17 | private String nomeArquivo; 18 | 19 | public ContatosCSV(String nomeArquivo) { 20 | this.nomeArquivo = nomeArquivo; 21 | } 22 | 23 | @Override 24 | public List todos() { 25 | List contatos = new ArrayList<>(); 26 | CSVReader csvReader = null; 27 | 28 | try { 29 | URI uri = this.getClass().getResource("/" + nomeArquivo).toURI(); 30 | File arquivoCsv = new File(uri); 31 | FileReader fileReader = new FileReader(arquivoCsv); 32 | csvReader = new CSVReader(fileReader); 33 | String [] nextLine; 34 | 35 | while ((nextLine = csvReader.readNext()) != null) { 36 | contatos.add(new Contato(nextLine[0].trim(), nextLine[1].trim())); 37 | } 38 | } catch (Exception e) { 39 | throw new RuntimeException("Erro lendo arquivo csv", e); 40 | } finally { 41 | try { 42 | csvReader.close(); 43 | } catch (IOException e) { } 44 | } 45 | 46 | return contatos; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/maladireta/csv/MalaDiretaCSV.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta.csv; 2 | 3 | import com.algaworks.contato.Contatos; 4 | import com.algaworks.maladireta.MalaDireta; 5 | 6 | public class MalaDiretaCSV extends MalaDireta { 7 | 8 | private String nomeArquivo; 9 | 10 | public MalaDiretaCSV(String nomeArquivo) { 11 | this.nomeArquivo = nomeArquivo; 12 | } 13 | 14 | @Override 15 | protected Contatos criarContatos() { 16 | return new ContatosCSV(nomeArquivo); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/maladireta/xml/ContatosXML.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta.xml; 2 | 3 | import java.net.URL; 4 | import java.util.List; 5 | 6 | import com.algaworks.contato.Contato; 7 | import com.algaworks.contato.Contatos; 8 | import com.thoughtworks.xstream.XStream; 9 | 10 | public class ContatosXML implements Contatos { 11 | 12 | private String nomeArquivo; 13 | 14 | public ContatosXML(String nomeArquivo) { 15 | this.nomeArquivo = nomeArquivo; 16 | } 17 | 18 | @SuppressWarnings("unchecked") 19 | @Override 20 | public List todos() { 21 | XStream xstream = new XStream(); 22 | xstream.alias("contatos", List.class); 23 | xstream.alias("contato", Contato.class); 24 | 25 | URL arquivo = this.getClass().getResource("/" + nomeArquivo); 26 | return (List) xstream.fromXML(arquivo); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/java/com/algaworks/maladireta/xml/MalaDiretaXML.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta.xml; 2 | 3 | import com.algaworks.contato.Contatos; 4 | import com.algaworks.maladireta.MalaDireta; 5 | 6 | public class MalaDiretaXML extends MalaDireta { 7 | 8 | private String nomeArquivo; 9 | 10 | public MalaDiretaXML(String nomeArquivo) { 11 | this.nomeArquivo = nomeArquivo; 12 | } 13 | 14 | @Override 15 | protected Contatos criarContatos() { 16 | return new ContatosXML(nomeArquivo); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/resources/contatos.csv: -------------------------------------------------------------------------------- 1 | João Silva, joao@email.com 2 | Maria Rita, maria@email.com -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/main/resources/contatos.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | João Silva 4 | joao@email.com 5 | 6 | 7 | Maria Rita 8 | maria@email.com 9 | 10 | 11 | Renato Aragão 12 | renato@email.com 13 | 14 | -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/test/java/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta-cliente/src/test/java/.gitignore -------------------------------------------------------------------------------- /Factory Method/maladireta-cliente/src/test/resources/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta-cliente/src/test/resources/.gitignore -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | maladireta-lib 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/main/java/com/algaworks/contato/Contato.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contato; 2 | 3 | public class Contato { 4 | 5 | private String nome; 6 | private String email; 7 | 8 | public Contato(String nome, String email) { 9 | super(); 10 | this.nome = nome; 11 | this.email = email; 12 | } 13 | 14 | public String getNome() { 15 | return nome; 16 | } 17 | 18 | public void setNome(String nome) { 19 | this.nome = nome; 20 | } 21 | 22 | public String getEmail() { 23 | return email; 24 | } 25 | 26 | public void setEmail(String email) { 27 | this.email = email; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/main/java/com/algaworks/contato/Contatos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contato; 2 | 3 | import java.util.List; 4 | 5 | public interface Contatos { 6 | 7 | public List todos(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/main/java/com/algaworks/maladireta/MalaDireta.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.contato.Contato; 6 | import com.algaworks.contato.Contatos; 7 | 8 | public abstract class MalaDireta { 9 | 10 | protected abstract Contatos criarContatos(); 11 | 12 | public final boolean enviarEmail(String mensagem) { 13 | List contatos = criarContatos().todos(); 14 | 15 | System.out.println("Conectando no servidor SMTP..."); 16 | System.out.println("Mensagem a ser enviada: " + mensagem); 17 | System.out.println(); 18 | 19 | for (Contato contato : contatos) { 20 | System.out.println("From: "); 21 | System.out.printf("To: [%s] <%s>\n", contato.getNome(), contato.getEmail()); 22 | System.out.println(mensagem); 23 | System.out.println(); 24 | } 25 | 26 | return true; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/main/resources/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta-lib/src/main/resources/.gitignore -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/test/java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta-lib/src/test/java/.gitkeep -------------------------------------------------------------------------------- /Factory Method/maladireta-lib/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta-lib/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Factory Method/maladireta/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks.maladireta 7 | maladireta 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | com.thoughtworks.xstream 31 | xstream 32 | 1.4.7 33 | 34 | 35 | 36 | 37 | net.sf.opencsv 38 | opencsv 39 | 2.3 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/java/com/algaworks/Principal.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import javax.swing.JOptionPane; 4 | 5 | import com.algaworks.maladireta.MalaDireta; 6 | 7 | public class Principal { 8 | 9 | public static void main(String[] args) { 10 | MalaDireta malaDireta = new MalaDireta(); 11 | String mensagem = JOptionPane.showInputDialog(null, "Informe a mensagem para o e-mail"); 12 | 13 | boolean status = malaDireta.enviarEmail("contatos.xml", mensagem); 14 | System.out.println(status); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/java/com/algaworks/contato/Contato.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contato; 2 | 3 | public class Contato { 4 | 5 | private String nome; 6 | private String email; 7 | 8 | public Contato(String nome, String email) { 9 | this.nome = nome; 10 | this.email = email; 11 | } 12 | 13 | public String getNome() { 14 | return nome; 15 | } 16 | 17 | public void setNome(String nome) { 18 | this.nome = nome; 19 | } 20 | 21 | public String getEmail() { 22 | return email; 23 | } 24 | 25 | public void setEmail(String email) { 26 | this.email = email; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/java/com/algaworks/contato/Contatos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contato; 2 | 3 | import java.io.File; 4 | import java.io.FileReader; 5 | import java.io.IOException; 6 | import java.net.URI; 7 | import java.net.URL; 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | import com.thoughtworks.xstream.XStream; 12 | 13 | import au.com.bytecode.opencsv.CSVReader; 14 | 15 | public class Contatos { 16 | 17 | public List recuperarContatosCSV(String nomeArquivo) { 18 | List contatos = new ArrayList<>(); 19 | CSVReader csvReader = null; 20 | 21 | try { 22 | URI uri = this.getClass().getResource("/" + nomeArquivo).toURI(); 23 | File arquivoCsv = new File(uri); 24 | FileReader fileReader = new FileReader(arquivoCsv); 25 | csvReader = new CSVReader(fileReader); 26 | String [] nextLine; 27 | 28 | while ((nextLine = csvReader.readNext()) != null) { 29 | contatos.add(new Contato(nextLine[0].trim(), nextLine[1].trim())); 30 | } 31 | } catch (Exception e) { 32 | throw new RuntimeException("Erro lendo arquivo csv", e); 33 | } finally { 34 | try { 35 | csvReader.close(); 36 | } catch (IOException e) { } 37 | } 38 | 39 | return contatos; 40 | } 41 | 42 | @SuppressWarnings("unchecked") 43 | public List recuperarContatosXML(String nomeArquivo) { 44 | XStream xstream = new XStream(); 45 | xstream.alias("contatos", List.class); 46 | xstream.alias("contato", Contato.class); 47 | 48 | URL arquivo = this.getClass().getResource("/" + nomeArquivo); 49 | return (List) xstream.fromXML(arquivo); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/java/com/algaworks/maladireta/MalaDireta.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.maladireta; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.contato.Contato; 6 | import com.algaworks.contato.Contatos; 7 | 8 | public class MalaDireta { 9 | 10 | public boolean enviarEmail(String nomeArquivo, String mensagem) { 11 | Contatos contatosRepositorio = new Contatos(); 12 | List contatos = contatosRepositorio.recuperarContatosXML(nomeArquivo); 13 | 14 | System.out.println("Conectando no servidor SMTP..."); 15 | System.out.println("Mensagem a ser enviada: " + mensagem); 16 | System.out.println(); 17 | 18 | for (Contato contato : contatos) { 19 | System.out.println("From: "); 20 | System.out.printf("To: [%s] <%s>\n", contato.getNome(), contato.getEmail()); 21 | System.out.println(mensagem); 22 | System.out.println(); 23 | } 24 | 25 | return true; 26 | } 27 | 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta/src/main/resources/.gitkeep -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/resources/contatos.csv: -------------------------------------------------------------------------------- 1 | João Silva, joao@email.com 2 | Maria Rita, maria@email.com -------------------------------------------------------------------------------- /Factory Method/maladireta/src/main/resources/contatos.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | João Silva 4 | joao@email.com 5 | 6 | 7 | Maria Rita 8 | maria@email.com 9 | 10 | 11 | Renato Aragão 12 | renato@email.com 13 | 14 | -------------------------------------------------------------------------------- /Factory Method/maladireta/src/test/java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta/src/test/java/.gitkeep -------------------------------------------------------------------------------- /Factory Method/maladireta/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Factory Method/maladireta/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | financeiro-sem-observer 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | org.quartz-scheduler 30 | quartz 31 | 2.2.1 32 | 33 | 34 | org.quartz-scheduler 35 | quartz-jobs 36 | 2.2.1 37 | 38 | 39 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/Principal.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import static org.quartz.CronScheduleBuilder.cronSchedule; 4 | import static org.quartz.JobBuilder.newJob; 5 | import static org.quartz.TriggerBuilder.newTrigger; 6 | 7 | import org.quartz.CronTrigger; 8 | import org.quartz.JobDataMap; 9 | import org.quartz.JobDetail; 10 | import org.quartz.Scheduler; 11 | import org.quartz.impl.StdSchedulerFactory; 12 | 13 | import com.algaworks.job.LancamentosVencidosJob; 14 | import com.algaworks.repository.Lancamentos; 15 | import com.algaworks.senders.EnviadorEmail; 16 | import com.algaworks.senders.EnviadorSMS; 17 | 18 | public class Principal { 19 | 20 | public static void main(String[] args) throws Exception { 21 | EnviadorEmail enviadorEmail = new EnviadorEmail(); 22 | EnviadorSMS enviadorSms = new EnviadorSMS(); 23 | Lancamentos lancamentos = new Lancamentos(); 24 | 25 | JobDataMap jobDataMap = new JobDataMap(); 26 | Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 27 | 28 | jobDataMap.put("lancamentos", lancamentos); 29 | jobDataMap.put("enviadorEmail", enviadorEmail); 30 | jobDataMap.put("enviadorSms", enviadorSms); 31 | 32 | JobDetail job = newJob(LancamentosVencidosJob.class) 33 | .setJobData(jobDataMap) 34 | .withIdentity("lancamentosVencidosJob", "lancamentosVencidosGroup") 35 | .build(); 36 | 37 | CronTrigger trigger = newTrigger() 38 | .withIdentity("trigger1", "group1") 39 | .withSchedule(cronSchedule("0 * * * * ?")) 40 | .build(); 41 | 42 | scheduler.scheduleJob(job, trigger); 43 | 44 | scheduler.start(); 45 | 46 | Thread.sleep(220000); 47 | 48 | scheduler.shutdown(true); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/job/LancamentosVencidosJob.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.job; 2 | 3 | import java.util.List; 4 | 5 | import org.quartz.Job; 6 | import org.quartz.JobDataMap; 7 | import org.quartz.JobExecutionContext; 8 | import org.quartz.JobExecutionException; 9 | 10 | import com.algaworks.model.Lancamento; 11 | import com.algaworks.repository.Lancamentos; 12 | import com.algaworks.senders.EnviadorEmail; 13 | import com.algaworks.senders.EnviadorSMS; 14 | 15 | public class LancamentosVencidosJob implements Job { 16 | 17 | @Override 18 | public void execute(JobExecutionContext context) throws JobExecutionException { 19 | JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); 20 | 21 | Lancamentos lancamentos = (Lancamentos) jobDataMap.get("lancamentos"); 22 | List lancamentosVencidos = lancamentos.todosVencidos(); 23 | 24 | EnviadorEmail enviadorEmail = (EnviadorEmail) jobDataMap.get("enviadorEmail"); 25 | EnviadorSMS enviadorSms = (EnviadorSMS) jobDataMap.get("enviadorSms"); 26 | enviadorEmail.enviar(lancamentosVencidos); 27 | enviadorSms.enviar(lancamentosVencidos); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/model/Lancamento.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | public class Lancamento { 7 | 8 | private Long codigo; 9 | private Pessoa pessoa; 10 | private String descricao; 11 | private BigDecimal valor; 12 | private TipoLancamento tipo; 13 | private Date dataVencimento; 14 | 15 | public Long getCodigo() { 16 | return codigo; 17 | } 18 | 19 | public void setCodigo(Long codigo) { 20 | this.codigo = codigo; 21 | } 22 | 23 | public Pessoa getPessoa() { 24 | return pessoa; 25 | } 26 | 27 | public void setPessoa(Pessoa pessoa) { 28 | this.pessoa = pessoa; 29 | } 30 | 31 | public String getDescricao() { 32 | return descricao; 33 | } 34 | 35 | public void setDescricao(String descricao) { 36 | this.descricao = descricao; 37 | } 38 | 39 | public BigDecimal getValor() { 40 | return valor; 41 | } 42 | 43 | public void setValor(BigDecimal valor) { 44 | this.valor = valor; 45 | } 46 | 47 | public TipoLancamento getTipo() { 48 | return tipo; 49 | } 50 | 51 | public void setTipo(TipoLancamento tipo) { 52 | this.tipo = tipo; 53 | } 54 | 55 | public Date getDataVencimento() { 56 | return dataVencimento; 57 | } 58 | 59 | public void setDataVencimento(Date dataVencimento) { 60 | this.dataVencimento = dataVencimento; 61 | } 62 | 63 | @Override 64 | public int hashCode() { 65 | final int prime = 31; 66 | int result = 1; 67 | result = prime * result + ((codigo == null) ? 0 : codigo.hashCode()); 68 | return result; 69 | } 70 | 71 | @Override 72 | public boolean equals(Object obj) { 73 | if (this == obj) 74 | return true; 75 | if (obj == null) 76 | return false; 77 | if (getClass() != obj.getClass()) 78 | return false; 79 | Lancamento other = (Lancamento) obj; 80 | if (codigo == null) { 81 | if (other.codigo != null) 82 | return false; 83 | } else if (!codigo.equals(other.codigo)) 84 | return false; 85 | return true; 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/model/Pessoa.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | public class Pessoa { 4 | 5 | private Long codigo; 6 | private String nome; 7 | private String email; 8 | private String telefone; 9 | 10 | public Long getCodigo() { 11 | return codigo; 12 | } 13 | 14 | public void setCodigo(Long codigo) { 15 | this.codigo = codigo; 16 | } 17 | 18 | public String getNome() { 19 | return nome; 20 | } 21 | 22 | public void setNome(String nome) { 23 | this.nome = nome; 24 | } 25 | 26 | public String getEmail() { 27 | return email; 28 | } 29 | 30 | public void setEmail(String email) { 31 | this.email = email; 32 | } 33 | 34 | public String getTelefone() { 35 | return telefone; 36 | } 37 | 38 | public void setTelefone(String telefone) { 39 | this.telefone = telefone; 40 | } 41 | 42 | @Override 43 | public int hashCode() { 44 | final int prime = 31; 45 | int result = 1; 46 | result = prime * result + ((codigo == null) ? 0 : codigo.hashCode()); 47 | return result; 48 | } 49 | 50 | @Override 51 | public boolean equals(Object obj) { 52 | if (this == obj) 53 | return true; 54 | if (obj == null) 55 | return false; 56 | if (getClass() != obj.getClass()) 57 | return false; 58 | Pessoa other = (Pessoa) obj; 59 | if (codigo == null) { 60 | if (other.codigo != null) 61 | return false; 62 | } else if (!codigo.equals(other.codigo)) 63 | return false; 64 | return true; 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/model/TipoLancamento.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | public enum TipoLancamento { 4 | 5 | DESPESA("Despesa"), 6 | RECEITA("Receita"); 7 | 8 | private String descricao; 9 | 10 | TipoLancamento(String descricao) { 11 | this.descricao = descricao; 12 | } 13 | 14 | public String getDescricao() { 15 | return this.descricao; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/model/builder/LancamentoBuilder.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model.builder; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | import com.algaworks.model.Lancamento; 7 | import com.algaworks.model.Pessoa; 8 | import com.algaworks.model.TipoLancamento; 9 | 10 | public class LancamentoBuilder { 11 | 12 | private Lancamento instancia; 13 | 14 | public static LancamentoBuilder crairLancamento() { 15 | return new LancamentoBuilder(); 16 | } 17 | 18 | public LancamentoBuilder() { 19 | this.instancia = new Lancamento(); 20 | } 21 | 22 | public LancamentoBuilder comPessoa(String nome, String email, String telefone) { 23 | Pessoa pessoa = new Pessoa(); 24 | pessoa.setNome(nome); 25 | pessoa.setEmail(email); 26 | pessoa.setTelefone(telefone); 27 | this.instancia.setPessoa(pessoa); 28 | 29 | return this; 30 | } 31 | 32 | public LancamentoBuilder comDescricao(String descricao) { 33 | this.instancia.setDescricao(descricao); 34 | return this; 35 | } 36 | 37 | public LancamentoBuilder comValor(BigDecimal valor) { 38 | this.instancia.setValor(valor); 39 | return this; 40 | } 41 | 42 | public LancamentoBuilder doTipo(TipoLancamento tipo) { 43 | this.instancia.setTipo(tipo); 44 | return this; 45 | } 46 | 47 | public LancamentoBuilder comDataVencimento(Date dataVencimento) { 48 | this.instancia.setDataVencimento(dataVencimento); 49 | return this; 50 | } 51 | 52 | public Lancamento criar() { 53 | return this.instancia; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/repository/Lancamentos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Arrays; 5 | import java.util.Date; 6 | import java.util.List; 7 | 8 | import com.algaworks.model.Lancamento; 9 | import com.algaworks.model.TipoLancamento; 10 | import com.algaworks.model.builder.LancamentoBuilder; 11 | 12 | public class Lancamentos { 13 | 14 | public List todosVencidos() { 15 | // Faz consulta no banco buscando lançamentos vencidos 16 | Lancamento lancamento1 = LancamentoBuilder.crairLancamento() 17 | .comPessoa("João Silva", "joao@email.com", "(11)9999-8888") 18 | .comDescricao("Mesa tabaco MDF") 19 | .comValor(new BigDecimal("1225.45")) 20 | .comDataVencimento(new Date()) 21 | .doTipo(TipoLancamento.DESPESA) 22 | .criar(); 23 | 24 | Lancamento lancamento2 = LancamentoBuilder.crairLancamento() 25 | .comPessoa("Renato Santos", "renato@email.com", "(21)8888-9999") 26 | .comDescricao("Armário MDF 3.00 x 2x40") 27 | .comValor(new BigDecimal("3200.00")) 28 | .comDataVencimento(new Date()) 29 | .doTipo(TipoLancamento.DESPESA) 30 | .criar(); 31 | 32 | return Arrays.asList(lancamento1, lancamento2); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/senders/EnviadorEmail.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.senders; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.model.Lancamento; 6 | 7 | public class EnviadorEmail { 8 | 9 | public void enviar(List lancamentosVencidos) { 10 | for (Lancamento lancamento : lancamentosVencidos) { 11 | System.out.println("Enviando e-mail para " + lancamento.getPessoa().getEmail()); 12 | } 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/main/java/com/algaworks/senders/EnviadorSMS.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.senders; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.model.Lancamento; 6 | 7 | public class EnviadorSMS { 8 | 9 | public void enviar(List lancamentosVencidos) { 10 | for (Lancamento lancamento : lancamentosVencidos) { 11 | System.out.println("Enviando SMS para " + lancamento.getPessoa().getTelefone()); 12 | } 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/test/java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Observer/financeiro-sem-observer/src/test/java/.gitkeep -------------------------------------------------------------------------------- /Observer/financeiro-sem-observer/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Observer/financeiro-sem-observer/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Observer/financeiro/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | financeiro 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | org.quartz-scheduler 30 | quartz 31 | 2.2.1 32 | 33 | 34 | org.quartz-scheduler 35 | quartz-jobs 36 | 2.2.1 37 | 38 | 39 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/Principal.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import static org.quartz.CronScheduleBuilder.cronSchedule; 4 | import static org.quartz.JobBuilder.newJob; 5 | import static org.quartz.TriggerBuilder.newTrigger; 6 | 7 | import org.quartz.CronTrigger; 8 | import org.quartz.JobDataMap; 9 | import org.quartz.JobDetail; 10 | import org.quartz.Scheduler; 11 | import org.quartz.impl.StdSchedulerFactory; 12 | 13 | import com.algaworks.job.LancamentosVencidosJob; 14 | import com.algaworks.listeners.EmailListener; 15 | import com.algaworks.listeners.Listener; 16 | import com.algaworks.listeners.SMSListener; 17 | import com.algaworks.notifier.Notificador; 18 | import com.algaworks.notifier.NotificadorLancamentosVencidos; 19 | import com.algaworks.repository.Lancamentos; 20 | 21 | public class Principal { 22 | 23 | public static void main(String[] args) throws Exception { 24 | Notificador notificador = new NotificadorLancamentosVencidos(); 25 | 26 | Listener enviadorEmail = new EmailListener(notificador); 27 | Listener enviadorSms = new SMSListener(notificador); 28 | 29 | JobDataMap jobDataMap = new JobDataMap(); 30 | Lancamentos lancamentos = new Lancamentos(); 31 | 32 | Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 33 | 34 | jobDataMap.put("lancamentos", lancamentos); 35 | jobDataMap.put("notificador", notificador); 36 | 37 | JobDetail job = newJob(LancamentosVencidosJob.class) 38 | .setJobData(jobDataMap) 39 | .withIdentity("lancamentosVencidosJob", "lancamentosVencidosGroup") 40 | .build(); 41 | 42 | CronTrigger trigger = newTrigger() 43 | .withIdentity("trigger1", "group1") 44 | .withSchedule(cronSchedule("0 * * * * ?")) 45 | .build(); 46 | 47 | scheduler.scheduleJob(job, trigger); 48 | 49 | scheduler.start(); 50 | 51 | Thread.sleep(220000); 52 | 53 | scheduler.shutdown(true); 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/job/LancamentosVencidosJob.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.job; 2 | 3 | import java.util.List; 4 | 5 | import org.quartz.Job; 6 | import org.quartz.JobDataMap; 7 | import org.quartz.JobExecutionContext; 8 | import org.quartz.JobExecutionException; 9 | 10 | import com.algaworks.model.Lancamento; 11 | import com.algaworks.notifier.Notificador; 12 | import com.algaworks.repository.Lancamentos; 13 | 14 | public class LancamentosVencidosJob implements Job { 15 | 16 | @Override 17 | public void execute(JobExecutionContext context) throws JobExecutionException { 18 | JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); 19 | 20 | Lancamentos lancamentos = (Lancamentos) jobDataMap.get("lancamentos"); 21 | Notificador notificador = (Notificador) jobDataMap.get("notificador"); 22 | 23 | List lancamentosVencidos = lancamentos.todosVencidos(); 24 | notificador.novosLancamentosVencidos(lancamentosVencidos); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/listeners/EmailListener.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.listeners; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.model.Lancamento; 6 | import com.algaworks.notifier.Notificador; 7 | 8 | public class EmailListener implements Listener { 9 | 10 | private Notificador notificador; 11 | 12 | public EmailListener(Notificador notificador) { 13 | this.notificador = notificador; 14 | this.notificador.registrarListener(this); 15 | } 16 | 17 | @Override 18 | public void atualizar() { 19 | List lancamentosVencidos = this.notificador.getLancamentosVencidos(); 20 | 21 | for (Lancamento lancamento : lancamentosVencidos) { 22 | System.out.println("Enviando e-mail para " + lancamento.getPessoa().getEmail()); 23 | } 24 | 25 | // this.notificador.removerListener(this); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/listeners/Listener.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.listeners; 2 | 3 | public interface Listener { 4 | 5 | public void atualizar(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/listeners/SMSListener.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.listeners; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.model.Lancamento; 6 | import com.algaworks.notifier.Notificador; 7 | 8 | public class SMSListener implements Listener { 9 | 10 | private Notificador notificador; 11 | 12 | public SMSListener(Notificador notificador) { 13 | this.notificador = notificador; 14 | this.notificador.registrarListener(this); 15 | } 16 | 17 | @Override 18 | public void atualizar() { 19 | List lancamentosVencidos = this.notificador.getLancamentosVencidos(); 20 | 21 | for (Lancamento lancamento : lancamentosVencidos) { 22 | System.out.println("Enviando SMS para " + lancamento.getPessoa().getTelefone()); 23 | } 24 | 25 | // this.notificador.removerListener(this); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/model/Lancamento.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | public class Lancamento { 7 | 8 | private Long codigo; 9 | private Pessoa pessoa; 10 | private String descricao; 11 | private BigDecimal valor; 12 | private TipoLancamento tipo; 13 | private Date dataVencimento; 14 | 15 | public Long getCodigo() { 16 | return codigo; 17 | } 18 | 19 | public void setCodigo(Long codigo) { 20 | this.codigo = codigo; 21 | } 22 | 23 | public Pessoa getPessoa() { 24 | return pessoa; 25 | } 26 | 27 | public void setPessoa(Pessoa pessoa) { 28 | this.pessoa = pessoa; 29 | } 30 | 31 | public String getDescricao() { 32 | return descricao; 33 | } 34 | 35 | public void setDescricao(String descricao) { 36 | this.descricao = descricao; 37 | } 38 | 39 | public BigDecimal getValor() { 40 | return valor; 41 | } 42 | 43 | public void setValor(BigDecimal valor) { 44 | this.valor = valor; 45 | } 46 | 47 | public TipoLancamento getTipo() { 48 | return tipo; 49 | } 50 | 51 | public void setTipo(TipoLancamento tipo) { 52 | this.tipo = tipo; 53 | } 54 | 55 | public Date getDataVencimento() { 56 | return dataVencimento; 57 | } 58 | 59 | public void setDataVencimento(Date dataVencimento) { 60 | this.dataVencimento = dataVencimento; 61 | } 62 | 63 | @Override 64 | public int hashCode() { 65 | final int prime = 31; 66 | int result = 1; 67 | result = prime * result + ((codigo == null) ? 0 : codigo.hashCode()); 68 | return result; 69 | } 70 | 71 | @Override 72 | public boolean equals(Object obj) { 73 | if (this == obj) 74 | return true; 75 | if (obj == null) 76 | return false; 77 | if (getClass() != obj.getClass()) 78 | return false; 79 | Lancamento other = (Lancamento) obj; 80 | if (codigo == null) { 81 | if (other.codigo != null) 82 | return false; 83 | } else if (!codigo.equals(other.codigo)) 84 | return false; 85 | return true; 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/model/Pessoa.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | public class Pessoa { 4 | 5 | private Long codigo; 6 | private String nome; 7 | private String email; 8 | private String telefone; 9 | 10 | public Long getCodigo() { 11 | return codigo; 12 | } 13 | 14 | public void setCodigo(Long codigo) { 15 | this.codigo = codigo; 16 | } 17 | 18 | public String getNome() { 19 | return nome; 20 | } 21 | 22 | public void setNome(String nome) { 23 | this.nome = nome; 24 | } 25 | 26 | public String getEmail() { 27 | return email; 28 | } 29 | 30 | public void setEmail(String email) { 31 | this.email = email; 32 | } 33 | 34 | public String getTelefone() { 35 | return telefone; 36 | } 37 | 38 | public void setTelefone(String telefone) { 39 | this.telefone = telefone; 40 | } 41 | 42 | @Override 43 | public int hashCode() { 44 | final int prime = 31; 45 | int result = 1; 46 | result = prime * result + ((codigo == null) ? 0 : codigo.hashCode()); 47 | return result; 48 | } 49 | 50 | @Override 51 | public boolean equals(Object obj) { 52 | if (this == obj) 53 | return true; 54 | if (obj == null) 55 | return false; 56 | if (getClass() != obj.getClass()) 57 | return false; 58 | Pessoa other = (Pessoa) obj; 59 | if (codigo == null) { 60 | if (other.codigo != null) 61 | return false; 62 | } else if (!codigo.equals(other.codigo)) 63 | return false; 64 | return true; 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/model/TipoLancamento.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | public enum TipoLancamento { 4 | 5 | DESPESA("Despesa"), 6 | RECEITA("Receita"); 7 | 8 | private String descricao; 9 | 10 | TipoLancamento(String descricao) { 11 | this.descricao = descricao; 12 | } 13 | 14 | public String getDescricao() { 15 | return this.descricao; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/model/builder/LancamentoBuilder.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model.builder; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Date; 5 | 6 | import com.algaworks.model.Lancamento; 7 | import com.algaworks.model.Pessoa; 8 | import com.algaworks.model.TipoLancamento; 9 | 10 | public class LancamentoBuilder { 11 | 12 | private Lancamento instancia; 13 | 14 | public static LancamentoBuilder crairLancamento() { 15 | return new LancamentoBuilder(); 16 | } 17 | 18 | public LancamentoBuilder() { 19 | this.instancia = new Lancamento(); 20 | } 21 | 22 | public LancamentoBuilder comPessoa(String nome, String email, String telefone) { 23 | Pessoa pessoa = new Pessoa(); 24 | pessoa.setNome(nome); 25 | pessoa.setEmail(email); 26 | pessoa.setTelefone(telefone); 27 | this.instancia.setPessoa(pessoa); 28 | 29 | return this; 30 | } 31 | 32 | public LancamentoBuilder comDescricao(String descricao) { 33 | this.instancia.setDescricao(descricao); 34 | return this; 35 | } 36 | 37 | public LancamentoBuilder comValor(BigDecimal valor) { 38 | this.instancia.setValor(valor); 39 | return this; 40 | } 41 | 42 | public LancamentoBuilder doTipo(TipoLancamento tipo) { 43 | this.instancia.setTipo(tipo); 44 | return this; 45 | } 46 | 47 | public LancamentoBuilder comDataVencimento(Date dataVencimento) { 48 | this.instancia.setDataVencimento(dataVencimento); 49 | return this; 50 | } 51 | 52 | public Lancamento criar() { 53 | return this.instancia; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/notifier/Notificador.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.notifier; 2 | 3 | import java.util.List; 4 | 5 | import com.algaworks.listeners.Listener; 6 | import com.algaworks.model.Lancamento; 7 | 8 | public interface Notificador { 9 | 10 | public void registrarListener(Listener listener); 11 | public void removerListener(Listener listener); 12 | public void notificarListeners(); 13 | 14 | public void novosLancamentosVencidos(List lancamentosVencidos); 15 | public List getLancamentosVencidos(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/notifier/NotificadorLancamentosVencidos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.notifier; 2 | 3 | import java.util.HashSet; 4 | import java.util.List; 5 | import java.util.Set; 6 | 7 | import com.algaworks.listeners.Listener; 8 | import com.algaworks.model.Lancamento; 9 | 10 | public class NotificadorLancamentosVencidos implements Notificador { 11 | 12 | private Set listeners; 13 | private List lancamentosVencidos; 14 | 15 | public NotificadorLancamentosVencidos() { 16 | this.listeners = new HashSet<>(); 17 | } 18 | 19 | @Override 20 | public void registrarListener(Listener listener) { 21 | this.listeners.add(listener); 22 | } 23 | 24 | @Override 25 | public void removerListener(Listener listener) { 26 | this.listeners.remove(listener); 27 | } 28 | 29 | @Override 30 | public void notificarListeners() { 31 | for (Listener listener : listeners) { 32 | listener.atualizar(); 33 | } 34 | } 35 | 36 | @Override 37 | public void novosLancamentosVencidos(List lancamentosVencidos) { 38 | this.lancamentosVencidos = lancamentosVencidos; 39 | this.notificarListeners(); 40 | } 41 | 42 | @Override 43 | public List getLancamentosVencidos() { 44 | return this.lancamentosVencidos; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/java/com/algaworks/repository/Lancamentos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.Arrays; 5 | import java.util.Date; 6 | import java.util.List; 7 | 8 | import com.algaworks.model.Lancamento; 9 | import com.algaworks.model.TipoLancamento; 10 | import com.algaworks.model.builder.LancamentoBuilder; 11 | 12 | public class Lancamentos { 13 | 14 | public List todosVencidos() { 15 | // Faz consulta no banco buscando lançamentos vencidos 16 | Lancamento lancamento1 = LancamentoBuilder.crairLancamento() 17 | .comPessoa("João Silva", "joao@email.com", "(11)9999-8888") 18 | .comDescricao("Mesa tabaco MDF") 19 | .comValor(new BigDecimal("1225.45")) 20 | .comDataVencimento(new Date()) 21 | .doTipo(TipoLancamento.DESPESA) 22 | .criar(); 23 | 24 | Lancamento lancamento2 = LancamentoBuilder.crairLancamento() 25 | .comPessoa("Renato Santos", "renato@email.com", "(21)8888-9999") 26 | .comDescricao("Armário MDF 3.00 x 2x40") 27 | .comValor(new BigDecimal("3200.00")) 28 | .comDataVencimento(new Date()) 29 | .doTipo(TipoLancamento.DESPESA) 30 | .criar(); 31 | 32 | return Arrays.asList(lancamento1, lancamento2); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Observer/financeiro/src/main/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Observer/financeiro/src/main/resources/.gitkeep -------------------------------------------------------------------------------- /Observer/financeiro/src/test/java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Observer/financeiro/src/test/java/.gitkeep -------------------------------------------------------------------------------- /Observer/financeiro/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Observer/financeiro/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | carregar-contatos-com-proxy 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | com.thoughtworks.xstream 31 | xstream 32 | 1.4.7 33 | 34 | 35 | 36 | 37 | junit 38 | junit 39 | 4.11 40 | test 41 | 42 | 43 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/main/java/com/algaworks/contatos/ContatosXML.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contatos; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.algaworks.model.Contato; 8 | import com.algaworks.repository.Contatos; 9 | import com.thoughtworks.xstream.XStream; 10 | 11 | public class ContatosXML implements Contatos { 12 | 13 | private Map contatosEmCache = new HashMap<>(); 14 | 15 | @SuppressWarnings("unchecked") 16 | public ContatosXML(String... nomesArquivos) { 17 | XStream xstream = new XStream(); 18 | xstream.alias("contatos", List.class); 19 | xstream.alias("contato", Contato.class); 20 | 21 | for (String nomeArquivo : nomesArquivos) { 22 | System.out.println("Carregando arquivo: " + nomeArquivo); 23 | List contatosCarregados = (List) xstream.fromXML(this.getClass().getResource("/" + nomeArquivo)); 24 | for (Contato contato : contatosCarregados) { 25 | contatosEmCache.put(contato.getEmail(), contato.getNome()); 26 | } 27 | } 28 | } 29 | 30 | @Override 31 | public String buscarPor(String email) { 32 | return contatosEmCache.get(email); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/main/java/com/algaworks/model/Contato.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | 4 | public class Contato { 5 | 6 | private String nome; 7 | private String email; 8 | 9 | public String getNome() { 10 | return nome; 11 | } 12 | 13 | public void setNome(String nome) { 14 | this.nome = nome; 15 | } 16 | 17 | public String getEmail() { 18 | return email; 19 | } 20 | 21 | public void setEmail(String email) { 22 | this.email = email; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/main/java/com/algaworks/repository/Contatos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository; 2 | 3 | public interface Contatos { 4 | 5 | public String buscarPor(String email); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/main/resources/contatos1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | João Silva 4 | joao@email.com 5 | 6 | 7 | Maria Rita 8 | maria@email.com 9 | 10 | 11 | Renato Aragão 12 | renato@email.com 13 | 14 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/main/resources/contatos2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | José Santos 4 | jose@email.com 5 | 6 | 7 | Renata Pereira 8 | renata@email.com 9 | 10 | 11 | Mauricio Ricardo 12 | mauricio@email.com 13 | 14 | 15 | Sara Silva 16 | sara@email.com 17 | 18 | 19 | Roberto Costa 20 | roberto@email.com 21 | 22 | 23 | Julio Rodrigues 24 | julio@email.com 25 | 26 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/test/java/com/algaworks/contatos/ContatosXMLProxy.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contatos; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.Random; 7 | 8 | import com.algaworks.repository.Contatos; 9 | 10 | public class ContatosXMLProxy implements Contatos { 11 | 12 | private ContatosXML contatosXML; 13 | private List nomesArquivos; 14 | 15 | public ContatosXMLProxy(String... nomesArquivos) { 16 | this.nomesArquivos = new ArrayList<>(Arrays.asList(nomesArquivos)); 17 | } 18 | 19 | @Override 20 | public String buscarPor(String email) { 21 | String nome = null; 22 | Random random = new Random(); 23 | 24 | int quantidadeArquivos = nomesArquivos.size(); 25 | for (int i = 0; i < quantidadeArquivos; i++) { 26 | int indiceParaPesquisa = random.nextInt(nomesArquivos.size()); 27 | 28 | String nomeArquivo = nomesArquivos.remove(indiceParaPesquisa); 29 | this.contatosXML = new ContatosXML(nomeArquivo); 30 | nome = this.contatosXML.buscarPor(email); 31 | if (nome != null) break; 32 | } 33 | 34 | return nome; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/test/java/com/algaworks/contatos/ContatosXMLTest.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contatos; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | import com.algaworks.repository.Contatos; 8 | 9 | public class ContatosXMLTest { 10 | 11 | @Test 12 | public void deveRetornarContato() { 13 | Contatos contatos = new ContatosXMLProxy("contatos1.xml", "contatos2.xml"); 14 | String nome = contatos.buscarPor("jose@email.com"); 15 | assertEquals("José Santos", nome); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-com-proxy/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Proxy/carregar-contatos-com-proxy/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | com.algaworks 7 | carregar-contatos-sem-padrao-proxy 8 | 1.0.0-SNAPSHOT 9 | 10 | 11 | UTF-8 12 | 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.7 21 | 1.7 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | com.thoughtworks.xstream 31 | xstream 32 | 1.4.7 33 | 34 | 35 | 36 | 37 | junit 38 | junit 39 | 4.11 40 | test 41 | 42 | 43 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/java/com/algaworks/BuscaContato.java: -------------------------------------------------------------------------------- 1 | package com.algaworks; 2 | 3 | import com.algaworks.contatos.ContatosXML; 4 | import com.algaworks.repository.Contatos; 5 | 6 | public class BuscaContato { 7 | 8 | public static void main(String[] args) { 9 | Contatos contatos = new ContatosXML("contatos1.xml", "contatos2.xml"); 10 | String nome = contatos.buscarPor("jose@email.com"); 11 | 12 | System.out.println(nome); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/java/com/algaworks/contatos/ContatosXML.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.contatos; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.algaworks.model.Contato; 8 | import com.algaworks.repository.Contatos; 9 | import com.thoughtworks.xstream.XStream; 10 | 11 | public class ContatosXML implements Contatos { 12 | 13 | private Map contatosEmCache = new HashMap<>(); 14 | 15 | @SuppressWarnings("unchecked") 16 | public ContatosXML(String... nomesArquivos) { 17 | XStream xstream = new XStream(); 18 | xstream.alias("contatos", List.class); 19 | xstream.alias("contato", Contato.class); 20 | 21 | for (String nomeArquivo : nomesArquivos) { 22 | System.out.println("Carregando arquivo: " + nomeArquivo); 23 | List contatosCarregados = (List) xstream.fromXML(this.getClass().getResource("/" + nomeArquivo)); 24 | for (Contato contato : contatosCarregados) { 25 | contatosEmCache.put(contato.getEmail(), contato.getNome()); 26 | } 27 | } 28 | } 29 | 30 | @Override 31 | public String buscarPor(String email) { 32 | return contatosEmCache.get(email); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/java/com/algaworks/model/Contato.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.model; 2 | 3 | 4 | public class Contato { 5 | 6 | private String nome; 7 | private String email; 8 | 9 | public String getNome() { 10 | return nome; 11 | } 12 | 13 | public void setNome(String nome) { 14 | this.nome = nome; 15 | } 16 | 17 | public String getEmail() { 18 | return email; 19 | } 20 | 21 | public void setEmail(String email) { 22 | this.email = email; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/java/com/algaworks/repository/Contatos.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.repository; 2 | 3 | public interface Contatos { 4 | 5 | public String buscarPor(String email); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/resources/contatos1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | João Silva 4 | joao@email.com 5 | 6 | 7 | Maria Rita 8 | maria@email.com 9 | 10 | 11 | Renato Aragão 12 | renato@email.com 13 | 14 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/main/resources/contatos2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | José Santos 4 | jose@email.com 5 | 6 | 7 | Renata Pereira 8 | renata@email.com 9 | 10 | 11 | Mauricio Ricardo 12 | mauricio@email.com 13 | 14 | 15 | Sara Silva 16 | sara@email.com 17 | 18 | 19 | Roberto Costa 20 | roberto@email.com 21 | 22 | 23 | Julio Rodrigues 24 | julio@email.com 25 | 26 | -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/test/java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Proxy/carregar-contatos-sem-padrao-proxy/src/test/java/.gitkeep -------------------------------------------------------------------------------- /Proxy/carregar-contatos-sem-padrao-proxy/src/test/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/Proxy/carregar-contatos-sem-padrao-proxy/src/test/resources/.gitkeep -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-design-patterns-do-zero/a4ed1b751df0c6598447c96beb14a6accf52d503/README.md -------------------------------------------------------------------------------- /Strategy/transportadora-com-strategy/src/com/algaworks/transportadora/Exemplo.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora; 2 | 3 | import java.util.Scanner; 4 | 5 | import com.algaworks.transportadora.service.Frete; 6 | import com.algaworks.transportadora.service.TipoFrete; 7 | 8 | public class Exemplo { 9 | 10 | public static void main(String[] args) { 11 | try (Scanner entrada = new Scanner(System.in)) { 12 | System.out.print("Informe a distância: "); 13 | int distancia = entrada.nextInt(); 14 | System.out.print("Qual o tipo de frete (1) Normal, (2) Sedex: "); 15 | int opcaoFrete = entrada.nextInt(); 16 | TipoFrete tipoFrete = TipoFrete.values()[opcaoFrete - 1]; 17 | 18 | Frete frete = tipoFrete.obterFrete(); 19 | double preco = frete.calcularPreco(distancia); 20 | System.out.printf("O valor total é de R$%.2f", preco); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Strategy/transportadora-com-strategy/src/com/algaworks/transportadora/service/Frete.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service; 2 | 3 | public interface Frete { 4 | 5 | public double calcularPreco(int distancia); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Strategy/transportadora-com-strategy/src/com/algaworks/transportadora/service/TipoFrete.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service; 2 | 3 | import com.algaworks.transportadora.service.frete.Normal; 4 | import com.algaworks.transportadora.service.frete.Sedex; 5 | 6 | public enum TipoFrete { 7 | 8 | NORMAL { 9 | @Override 10 | public Frete obterFrete() { 11 | return new Normal(); 12 | } 13 | }, 14 | SEDEX { 15 | @Override 16 | public Frete obterFrete() { 17 | return new Sedex(); 18 | } 19 | }; 20 | 21 | public abstract Frete obterFrete(); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Strategy/transportadora-com-strategy/src/com/algaworks/transportadora/service/frete/Normal.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service.frete; 2 | 3 | import com.algaworks.transportadora.service.Frete; 4 | 5 | public class Normal implements Frete { 6 | 7 | public double calcularPreco(int distancia) { 8 | return distancia * 1.25 + 10; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Strategy/transportadora-com-strategy/src/com/algaworks/transportadora/service/frete/Sedex.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service.frete; 2 | 3 | import com.algaworks.transportadora.service.Frete; 4 | 5 | public class Sedex implements Frete { 6 | 7 | public double calcularPreco(int distancia) { 8 | return distancia * 1.45 + 12; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Strategy/transportadora-sem-strategy/src/com/algaworks/transportadora/Exemplo.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora; 2 | 3 | import java.util.Scanner; 4 | 5 | import com.algaworks.transportadora.service.Frete; 6 | import com.algaworks.transportadora.service.TipoFrete; 7 | 8 | public class Exemplo { 9 | 10 | public static void main(String[] args) { 11 | try (Scanner entrada = new Scanner(System.in)) { 12 | System.out.print("Informe a distância: "); 13 | int distancia = entrada.nextInt(); 14 | System.out.print("Qual o tipo de frete (1) Normal, (2) Sedex: "); 15 | int opcaoFrete = entrada.nextInt(); 16 | TipoFrete tipoFrete = TipoFrete.values()[opcaoFrete - 1]; 17 | 18 | Frete frete = new Frete(tipoFrete); 19 | double preco = frete.calcularPreco(distancia); 20 | System.out.printf("O valor total é de R$%.2f", preco); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Strategy/transportadora-sem-strategy/src/com/algaworks/transportadora/service/Frete.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service; 2 | 3 | public class Frete { 4 | 5 | private TipoFrete tipo; 6 | 7 | public Frete(TipoFrete tipo) { 8 | this.tipo = tipo; 9 | } 10 | 11 | public double calcularPreco(int distancia) { 12 | double preco = 0; 13 | if (TipoFrete.NORMAL.equals(tipo)) { 14 | preco = distancia * 1.25 + 10; 15 | } else if (TipoFrete.SEDEX.equals(tipo)) { 16 | preco = distancia * 1.45 + 12; 17 | } 18 | 19 | return preco; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Strategy/transportadora-sem-strategy/src/com/algaworks/transportadora/service/TipoFrete.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.transportadora.service; 2 | 3 | public enum TipoFrete { 4 | 5 | NORMAL, 6 | SEDEX 7 | 8 | } 9 | --------------------------------------------------------------------------------