├── .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 |
--------------------------------------------------------------------------------