├── .github └── FUNDING.yml ├── .gitignore ├── README.md ├── pom.xml └── src └── main ├── java ├── dev │ └── rinaldo │ │ └── designpatterns │ │ ├── behavioral │ │ ├── Prototype_1.java │ │ ├── Prototype_2.java │ │ ├── Prototype_3.java │ │ ├── Prototype_4.java │ │ ├── Strategy_1.java │ │ ├── Strategy_2.java │ │ ├── Strategy_3.java │ │ ├── Strategy_4.java │ │ ├── TemplateMethod_1.java │ │ └── TemplateMethod_2.java │ │ ├── creational │ │ ├── FactoryMethod_1.java │ │ ├── FactoryMethod_2.java │ │ ├── FactoryMethod_3.java │ │ ├── FactoryMethod_4.java │ │ ├── Singleton_1.java │ │ ├── Singleton_2.java │ │ └── Singleton_3.java │ │ └── structural │ │ ├── Adapter_1.java │ │ ├── Adapter_2.java │ │ ├── Adapter_3.java │ │ ├── Decorator_1.java │ │ ├── Decorator_2.java │ │ ├── Decorator_3.java │ │ ├── Decorator_4.java │ │ ├── Proxy_1.java │ │ ├── Proxy_2.java │ │ └── Proxy_3.java └── diagrama.ucls └── resources └── FactoryMethod /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: rinaldodev 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ############################## 2 | ## Java 3 | ############################## 4 | .mtj.tmp/ 5 | *.class 6 | *.jar 7 | *.war 8 | *.ear 9 | *.nar 10 | hs_err_pid* 11 | 12 | ############################## 13 | ## Maven 14 | ############################## 15 | target/ 16 | pom.xml.tag 17 | pom.xml.releaseBackup 18 | pom.xml.versionsBackup 19 | pom.xml.next 20 | release.properties 21 | dependency-reduced-pom.xml 22 | buildNumber.properties 23 | .mvn/timing.properties 24 | .mvn/wrapper/maven-wrapper.jar 25 | 26 | ############################## 27 | ## Gradle 28 | ############################## 29 | bin/ 30 | build/ 31 | .gradle 32 | .gradletasknamecache 33 | gradle-app.setting 34 | !gradle-wrapper.jar 35 | 36 | ############################## 37 | ## IntelliJ 38 | ############################## 39 | out/ 40 | .idea/ 41 | .idea_modules/ 42 | *.iml 43 | *.ipr 44 | *.iws 45 | 46 | ############################## 47 | ## Eclipse 48 | ############################## 49 | .settings/ 50 | bin/ 51 | tmp/ 52 | .metadata 53 | .classpath 54 | .project 55 | *.tmp 56 | *.bak 57 | *.swp 58 | *~.nib 59 | local.properties 60 | .loadpath 61 | 62 | ############################## 63 | ## NetBeans 64 | ############################## 65 | nbproject/private/ 66 | build/ 67 | nbbuild/ 68 | dist/ 69 | nbdist/ 70 | nbactions.xml 71 | nb-configuration.xml 72 | 73 | ############################## 74 | ## OS X 75 | ############################## 76 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Curso Padrões de Projeto com Java 2 | 3 | Códigos feitos para o curso/playlist Curso Padrões de Projeto com Java, no canal RinaldoDev do YouTube. 4 | 5 | * Playlist no YouTube: https://www.youtube.com/playlist?list=PLuYctAHjg89bBeh25plGraaYiAsryusw6 6 | * Canal no YouTube: https://www.youtube.com/rinaldodev 7 | 8 | ## Me siga para mais conteúdo educacional gratuito! 9 | 10 | * Twitter: https://twitter.com/rinaldodev 11 | * LinkedIn: https://www.linkedin.com/in/rinaldodev/ 12 | * Twitch: https://www.twitch.tv/rinaldodev 13 | * Site: https://rinaldo.dev 14 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 4.0.0 5 | dev.rinaldo 6 | design-patterns 7 | 0.0.1-SNAPSHOT 8 | 9 | 10 | 11 | org.apache.maven.plugins 12 | maven-compiler-plugin 13 | 3.8.1 14 | 15 | 11 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Prototype_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | /** 4 | * Java Design Patterns - Prototype (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Prototype_1 { 9 | 10 | // Prototype (Cloneable) 11 | // ConcretePrototype 12 | // Cliente 13 | 14 | public static void main(String[] args) throws CloneNotSupportedException { 15 | Documento1 d = new Documento1(); 16 | d.nome = "ListaDeMembros.pdf"; 17 | d.tipo = "PDF"; 18 | d.visibilidade = "restrito"; 19 | d.localizacao = "arquivos.sistema:1234/p1o39d8a.pdf"; 20 | System.out.println(d); 21 | 22 | System.out.println("---"); 23 | 24 | Documento1 d2 = d.clone(); 25 | System.out.println(d2); 26 | 27 | System.out.println("---"); 28 | 29 | d2.nome = "Lista2.pdf"; 30 | System.out.println(d); 31 | System.out.println(d2); 32 | } 33 | 34 | } 35 | 36 | //---------------------------------------------------- 37 | 38 | final class Documento1 implements Cloneable { 39 | 40 | String nome; 41 | String visibilidade; 42 | String tipo; 43 | String localizacao; // url, path, etc 44 | 45 | @Override 46 | public Documento1 clone() throws CloneNotSupportedException { 47 | return (Documento1) super.clone(); 48 | } 49 | 50 | @Override 51 | public String toString() { 52 | return "Documento1 [nome=" + nome + ", visibilidade=" + visibilidade + ", tipo=" + tipo + ", localizacao=" + localizacao 53 | + "]"; 54 | } 55 | 56 | } 57 | 58 | //---------------------------------------------------- 59 | 60 | // Twitter: twitter.com/rinaldodev 61 | // LinkedIn: linkedin.com/in/rinaldodev 62 | // Twitch: twitch.tv/rinaldodev 63 | // GitHub: github.com/rinaldodev 64 | // Facebook: facebook.com/rinaldodev 65 | // Site: rinaldo.dev 66 | 67 | /* 68 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 69 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 70 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 71 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Prototype_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Java Design Patterns - Prototype (2) 8 | * 9 | * @author youtube.com/RinaldoDev 10 | */ 11 | public class Prototype_2 { 12 | 13 | public static void main(String[] args) { 14 | DocumentosRegistry2 registry = DocumentosRegistry2.getInstance(); 15 | Documento2 pdfRestrito = registry.getDocumento2("PDF RESTRITO"); 16 | System.out.println(pdfRestrito); 17 | pdfRestrito.nome = "ListaDeMembros.pdf"; 18 | System.out.println(pdfRestrito); 19 | 20 | pdfRestrito = registry.getDocumento2("PDF RESTRITO"); 21 | System.out.println(pdfRestrito); 22 | } 23 | 24 | } 25 | 26 | //---------------------------------------------------- 27 | 28 | final class Documento2 implements Cloneable { 29 | 30 | String nome; 31 | String visibilidade; 32 | String tipo; 33 | String localizacao; // url, path, etc 34 | 35 | @Override 36 | public Documento2 clone() throws CloneNotSupportedException { 37 | return (Documento2) super.clone(); 38 | } 39 | 40 | @Override 41 | public String toString() { 42 | return "Documento1 [nome=" + nome + ", visibilidade=" + visibilidade + ", tipo=" + tipo + ", localizacao=" + localizacao 43 | + "]"; 44 | } 45 | 46 | } 47 | 48 | //---------------------------------------------------- 49 | 50 | final class DocumentosRegistry2 { 51 | 52 | private static final DocumentosRegistry2 INSTANCE = new DocumentosRegistry2(); 53 | 54 | private static final Map REGISTRY = new HashMap<>(); 55 | 56 | static { 57 | Documento2 d1 = new Documento2(); 58 | d1.tipo = "PDF"; 59 | d1.visibilidade = "RESTRITO"; 60 | REGISTRY.put("PDF RESTRITO", d1); 61 | 62 | Documento2 d2 = new Documento2(); 63 | d2.tipo = "PDF"; 64 | d2.visibilidade = "PUBLICO"; 65 | REGISTRY.put("PDF PUBLICO", d2); 66 | 67 | Documento2 d3 = new Documento2(); 68 | d3.tipo = "DOC"; 69 | d3.visibilidade = "RESTRITO"; 70 | REGISTRY.put("DOC RESTRITO", d3); 71 | 72 | Documento2 d4 = new Documento2(); 73 | d4.tipo = "DOC"; 74 | d4.visibilidade = "RESTRITO"; 75 | REGISTRY.put("DOC PUBLICO", d4); 76 | } 77 | 78 | public static DocumentosRegistry2 getInstance() { 79 | return INSTANCE; 80 | } 81 | 82 | public Documento2 getDocumento2(String chave) { 83 | try { 84 | return REGISTRY.get(chave).clone(); 85 | } catch (CloneNotSupportedException e) { 86 | throw new RuntimeException(e); 87 | } 88 | } 89 | 90 | } 91 | 92 | //---------------------------------------------------- 93 | 94 | // Twitter: twitter.com/rinaldodev 95 | // LinkedIn: linkedin.com/in/rinaldodev 96 | // Twitch: twitch.tv/rinaldodev 97 | // GitHub: github.com/rinaldodev 98 | // Facebook: facebook.com/rinaldodev 99 | // Site: rinaldo.dev 100 | 101 | /* 102 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 103 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 104 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 105 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Prototype_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Java Design Patterns - Prototype (3) 8 | * 9 | * @author youtube.com/RinaldoDev 10 | */ 11 | public class Prototype_3 { 12 | 13 | public static void main(String[] args) { 14 | // entradas de usuário 15 | criarModelo("PDF", "RESTRITO"); 16 | // criarModelo("DOC", "RESTRITO"); 17 | // criarModelo("PDF", "PUBLICO"); 18 | // criarModelo("DOC", "PUBLICO"); 19 | 20 | DocumentosRegistry3 registry = DocumentosRegistry3.getInstance(); 21 | 22 | Documento3 novoDoc = registry.getDocumento3("PDF RESTRITO"); 23 | novoDoc.nome = "novo doc"; 24 | System.out.println(novoDoc); 25 | 26 | Documento3 novoDoc3 = registry.getDocumento3("PDF RESTRITO"); 27 | System.out.println(novoDoc3); 28 | } 29 | 30 | private static void criarModelo(String tipo, String visibilidade) { 31 | Documento3 documento = new Documento3(); 32 | documento.tipo = tipo; 33 | documento.visibilidade = visibilidade; 34 | documento.nome = tipo + " " + visibilidade; 35 | 36 | String chave = tipo + " " + visibilidade; 37 | DocumentosRegistry3.getInstance().addDocumento3(chave, documento); 38 | } 39 | 40 | } 41 | 42 | //---------------------------------------------------- 43 | 44 | final class Documento3 implements Cloneable { 45 | 46 | String nome; 47 | String visibilidade; 48 | String tipo; 49 | String localizacao; // url, path, etc 50 | // Documento2 doc -- PROBLEMA 51 | 52 | @Override 53 | public Documento3 clone() throws CloneNotSupportedException { 54 | return (Documento3) super.clone(); 55 | } 56 | 57 | @Override 58 | public String toString() { 59 | return "Documento1 [nome=" + nome + ", visibilidade=" + visibilidade + ", tipo=" + tipo + ", localizacao=" + localizacao 60 | + "]"; 61 | } 62 | 63 | } 64 | 65 | //---------------------------------------------------- 66 | 67 | final class DocumentosRegistry3 { 68 | 69 | private static final DocumentosRegistry3 INSTANCE = new DocumentosRegistry3(); 70 | private static final Map REGISTRY = new HashMap<>(); 71 | 72 | private DocumentosRegistry3() { 73 | } 74 | 75 | public static DocumentosRegistry3 getInstance() { 76 | return INSTANCE; 77 | } 78 | 79 | public Documento3 getDocumento3(String chave) { 80 | try { 81 | return REGISTRY.get(chave).clone(); 82 | } catch (CloneNotSupportedException e) { 83 | throw new RuntimeException(e); 84 | } 85 | } 86 | 87 | public Documento3 addDocumento3(String chave, Documento3 documento) { 88 | return REGISTRY.put(chave, documento); 89 | } 90 | 91 | } 92 | 93 | //---------------------------------------------------- 94 | 95 | // Twitter: twitter.com/rinaldodev 96 | // LinkedIn: linkedin.com/in/rinaldodev 97 | // Twitch: twitch.tv/rinaldodev 98 | // GitHub: github.com/rinaldodev 99 | // Facebook: facebook.com/rinaldodev 100 | // Site: rinaldo.dev 101 | 102 | /* 103 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 104 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 105 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 106 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Prototype_4.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Java Design Patterns - Prototype (4) 8 | * 9 | * @author youtube.com/RinaldoDev 10 | */ 11 | public class Prototype_4 { 12 | 13 | public static void main(String[] args) { 14 | // entradas de usuário 15 | criarModelo("PDF", "RESTRITO"); 16 | criarModelo("DOC", "RESTRITO"); 17 | criarModelo("PDF", "PUBLICO"); 18 | criarModelo("DOC", "PUBLICO"); 19 | 20 | DocumentosRegistry4 registry = DocumentosRegistry4.getInstance(); 21 | 22 | Documento4 novoDoc = registry.getDocumento4("DOC RESTRITO"); 23 | novoDoc.nome = "novo doc"; 24 | System.out.println(novoDoc); 25 | 26 | // Documento4 novoDoc4 = registry.getDocumento4("DOC RESTRITO"); 27 | // System.out.println(novoDoc4); 28 | } 29 | 30 | private static void criarModelo(String tipo, String visibilidade) { 31 | Documento4 documento = new Documento4(); 32 | documento.tipo = tipo; 33 | documento.visibilidade = visibilidade; 34 | documento.nome = tipo + " " + visibilidade; 35 | 36 | String chave = tipo + " " + visibilidade; 37 | DocumentosRegistry4.getInstance().addDocumento4(chave, documento); 38 | } 39 | 40 | } 41 | 42 | //---------------------------------------------------- 43 | 44 | final class Documento4 { 45 | 46 | String nome; 47 | String visibilidade; 48 | String tipo; 49 | String localizacao; // url, path, etc 50 | 51 | public Documento4() { 52 | } 53 | 54 | public Documento4(Documento4 documento4) { 55 | this.nome = documento4.nome; 56 | this.visibilidade = documento4.visibilidade; 57 | this.tipo = documento4.tipo; 58 | this.localizacao = documento4.localizacao; 59 | } 60 | 61 | public static Documento4 clone(Documento4 documento4) { 62 | Documento4 clone = new Documento4(); 63 | clone.nome = documento4.nome; 64 | clone.visibilidade = documento4.visibilidade; 65 | clone.tipo = documento4.tipo; 66 | clone.localizacao = documento4.localizacao; 67 | return clone; 68 | } 69 | 70 | @Override 71 | public String toString() { 72 | return "Documento1 [nome=" + nome + ", visibilidade=" + visibilidade + ", tipo=" + tipo + ", localizacao=" + localizacao 73 | + "]"; 74 | } 75 | 76 | } 77 | 78 | //---------------------------------------------------- 79 | 80 | final class DocumentosRegistry4 { 81 | 82 | private static final DocumentosRegistry4 INSTANCE = new DocumentosRegistry4(); 83 | private static final Map REGISTRY = new HashMap<>(); 84 | 85 | private DocumentosRegistry4() { 86 | } 87 | 88 | public static DocumentosRegistry4 getInstance() { 89 | return INSTANCE; 90 | } 91 | 92 | public Documento4 getDocumento4(String chave) { 93 | Documento4 prototype = REGISTRY.get(chave); 94 | return Documento4.clone(prototype); 95 | // return new Documento4(prototype); 96 | } 97 | 98 | public Documento4 addDocumento4(String chave, Documento4 documento) { 99 | return REGISTRY.put(chave, documento); 100 | } 101 | 102 | } 103 | 104 | //---------------------------------------------------- 105 | 106 | // Twitter: twitter.com/rinaldodev 107 | // LinkedIn: linkedin.com/in/rinaldodev 108 | // Twitch: twitch.tv/rinaldodev 109 | // GitHub: github.com/rinaldodev 110 | // Facebook: facebook.com/rinaldodev 111 | // Site: rinaldo.dev 112 | 113 | /* 114 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 115 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 116 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 117 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Strategy_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Strategy (1) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Strategy_1 { 11 | 12 | // Estrategia - Interface 13 | // Estrategia - Concreta 14 | // Contexto 15 | 16 | public static void main(String[] args) { 17 | BigDecimal valor = new BigDecimal("10"); 18 | Compra compra = new Compra(valor); 19 | 20 | // compra.processarCompra(new PagamentoCartaoCredito()); 21 | compra.processarCompra(new PagamentoCartaoDebito()); 22 | } 23 | 24 | } 25 | 26 | //---------------------------------------------------- 27 | 28 | class Compra { // Contexto 29 | 30 | // .. 31 | BigDecimal valor; 32 | 33 | public Compra(BigDecimal valor) { 34 | this.valor = valor; 35 | } 36 | 37 | void processarCompra(EstrategiaPagamento estrategiaPagamento) { 38 | // .. 39 | estrategiaPagamento.pagar(valor); 40 | } 41 | 42 | } 43 | 44 | //---------------------------------------------------- 45 | 46 | // PagamentoStrategy 47 | interface EstrategiaPagamento { // Estrategia - Interface 48 | 49 | void pagar(BigDecimal valor); 50 | 51 | } 52 | 53 | //---------------------------------------------------- 54 | 55 | //Estrategia - Concreta 56 | class PagamentoCartaoCredito implements EstrategiaPagamento { 57 | 58 | @Override 59 | public void pagar(BigDecimal valor) { 60 | System.out.println("Pagou no crédito " + valor); 61 | } 62 | 63 | } 64 | 65 | //---------------------------------------------------- 66 | 67 | //Estrategia - Concreta 68 | class PagamentoCartaoDebito implements EstrategiaPagamento { 69 | 70 | @Override 71 | public void pagar(BigDecimal valor) { 72 | System.out.println("Pagou no débito " + valor); 73 | } 74 | 75 | } 76 | 77 | /* 78 | * Twitter: @rinaldodev 79 | * LinkedIn: rinaldodev 80 | * Twitch: rinaldodev 81 | * GitHub: rinaldodev 82 | * Facebook: rinaldodev 83 | * Site: rinaldo.dev 84 | */ 85 | 86 | /* 87 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 88 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 89 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 90 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Strategy_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Strategy (2) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Strategy_2 { 11 | 12 | public static void main(String[] args) { 13 | BigDecimal valor = new BigDecimal("10"); 14 | Compra2 compra = new Compra2(valor); 15 | 16 | compra.processarCompra(new PagamentoCartaoCredito2()); 17 | //compra.processarCompra(new PagamentoCartaoDebito2()); 18 | } 19 | 20 | } 21 | 22 | //---------------------------------------------------- 23 | 24 | class Compra2 { 25 | 26 | // Long id; 27 | BigDecimal valor; 28 | // Tipo 29 | 30 | 31 | public Compra2(BigDecimal valor) { 32 | this.valor = valor; 33 | } 34 | 35 | void processarCompra(EstrategiaPagamento2 estrategiaPagamento) { 36 | estrategiaPagamento.pagar(this); 37 | } 38 | 39 | } 40 | 41 | //---------------------------------------------------- 42 | 43 | interface EstrategiaPagamento2 { 44 | 45 | void pagar(Compra2 compra); 46 | 47 | } 48 | 49 | //---------------------------------------------------- 50 | 51 | class PagamentoCartaoCredito2 implements EstrategiaPagamento2 { 52 | 53 | @Override 54 | public void pagar(Compra2 compra) { 55 | System.out.println("Pagou no crédito " + compra.valor); 56 | // compra.set... 57 | } 58 | 59 | } 60 | 61 | //---------------------------------------------------- 62 | 63 | class PagamentoCartaoDebito2 implements EstrategiaPagamento2 { 64 | 65 | @Override 66 | public void pagar(Compra2 compra) { 67 | System.out.println("Pagou no débito " + compra.valor); 68 | } 69 | 70 | } 71 | 72 | /* 73 | * Twitter: @rinaldodev 74 | * LinkedIn: rinaldodev 75 | * Twitch: rinaldodev 76 | * GitHub: rinaldodev 77 | * Facebook: rinaldodev 78 | * Site: rinaldo.dev 79 | */ 80 | 81 | /* 82 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 83 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 84 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 85 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Strategy_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Strategy (3) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Strategy_3 { 11 | 12 | public static void main(String[] args) { 13 | BigDecimal valor = new BigDecimal("10"); 14 | Compra3 compra = new Compra3(valor); 15 | 16 | compra.processar(new PagamentoCartaoCredito3()); 17 | //compra.processarCompra(new PagamentoCartaoDebito3()); 18 | } 19 | 20 | } 21 | 22 | //---------------------------------------------------- 23 | 24 | interface Pagavel3 { 25 | BigDecimal getValor(); 26 | // .. 27 | } 28 | 29 | //---------------------------------------------------- 30 | 31 | class Compra3 implements Pagavel3 { 32 | 33 | BigDecimal valor; 34 | 35 | public Compra3(BigDecimal valor) { 36 | this.valor = valor; 37 | } 38 | 39 | public void processar(EstrategiaPagamento3 estrategiaPagamento) { 40 | // .. 41 | estrategiaPagamento.pagar(this); 42 | // .. 43 | } 44 | 45 | @Override 46 | public BigDecimal getValor() { 47 | return valor; 48 | } 49 | 50 | } 51 | 52 | //---------------------------------------------------- 53 | 54 | interface EstrategiaPagamento3 { 55 | 56 | void pagar(Pagavel3 compra); 57 | 58 | } 59 | 60 | //---------------------------------------------------- 61 | 62 | class PagamentoCartaoCredito3 implements EstrategiaPagamento3 { 63 | 64 | @Override 65 | public void pagar(Pagavel3 pagavel) { 66 | System.out.println("Pagou no crédito " + pagavel.getValor()); 67 | } 68 | 69 | } 70 | 71 | //---------------------------------------------------- 72 | 73 | class PagamentoCartaoDebito3 implements EstrategiaPagamento3 { 74 | 75 | @Override 76 | public void pagar(Pagavel3 pagavel) { 77 | System.out.println("Pagou no débito " + pagavel.getValor()); 78 | } 79 | 80 | } 81 | 82 | /* 83 | * Twitter: @rinaldodev 84 | * LinkedIn: rinaldodev 85 | * Twitch: rinaldodev 86 | * GitHub: rinaldodev 87 | * Facebook: rinaldodev 88 | * Site: rinaldo.dev 89 | */ 90 | 91 | /* 92 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 93 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 94 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 95 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/Strategy_4.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | import static java.lang.System.out; 4 | 5 | import java.math.BigDecimal; 6 | 7 | /** 8 | * Java Design Patterns - Strategy (4) 9 | * 10 | * @author youtube.com/RinaldoDev 11 | */ 12 | public class Strategy_4 { 13 | 14 | public static void main(String[] args) { 15 | 16 | // List listaClientes 17 | // listaClientes.sort((c1, c2) -> c1.id > c2.id)) 18 | 19 | 20 | BigDecimal valor = new BigDecimal("10"); 21 | Compra4 compra = new Compra4(valor); 22 | 23 | compra.processarCompra(v -> out.println("Pagou no crédito " + v)); 24 | } 25 | 26 | } 27 | 28 | //---------------------------------------------------- 29 | 30 | class Compra4 { 31 | 32 | BigDecimal valor; 33 | 34 | public Compra4(BigDecimal valor) { 35 | this.valor = valor; 36 | } 37 | 38 | void processarCompra(EstrategiaPagamento4 estrategiaPagamento) { 39 | estrategiaPagamento.pagar(valor); 40 | } 41 | 42 | } 43 | 44 | //---------------------------------------------------- 45 | 46 | interface EstrategiaPagamento4 { 47 | void pagar(BigDecimal valor); 48 | } 49 | 50 | /* 51 | * Twitter: @rinaldodev 52 | * LinkedIn: rinaldodev 53 | * Twitch: rinaldodev 54 | * GitHub: rinaldodev 55 | * Facebook: rinaldodev 56 | * Site: rinaldo.dev 57 | */ 58 | 59 | /* 60 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 61 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 62 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 63 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/TemplateMethod_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | /** 4 | * Java Design Patterns - Template Method (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class TemplateMethod_1 { 9 | 10 | public static void main(String[] args) { 11 | ProcessadorPagamento processadorPagamento = new ProcessadorPagamentoCredito(); 12 | processadorPagamento.processarPagamento(); 13 | } 14 | 15 | } 16 | 17 | //---------------------------------------------------- 18 | 19 | // Abstrata 20 | // Concretas - Implementações 21 | 22 | abstract class ProcessadorPagamento { 23 | 24 | // template method 25 | public void processarPagamento() { 26 | preparar(); 27 | validar(); 28 | debitar(); 29 | notificar(); 30 | finalizar(); 31 | } 32 | 33 | protected abstract void debitar(); 34 | 35 | private void preparar() { 36 | System.out.println("Reservando produtos"); 37 | } 38 | 39 | private void validar() { 40 | System.out.println("Validando cadastro"); 41 | } 42 | 43 | protected void notificar() { 44 | System.out.println("Notificando usuário"); 45 | } 46 | 47 | protected void finalizar() { 48 | System.out.println("Finalizando compra"); 49 | } 50 | 51 | } 52 | 53 | //---------------------------------------------------- 54 | 55 | class ProcessadorPagamentoCredito extends ProcessadorPagamento { 56 | 57 | @Override 58 | protected void debitar() { 59 | System.out.println("Debitando.."); 60 | } 61 | 62 | @Override 63 | protected void notificar() { 64 | // super.notificar(); 65 | System.out.println("Notificações adicionais.."); 66 | } 67 | 68 | } 69 | 70 | //---------------------------------------------------- 71 | 72 | // Twitter: twitter.com/rinaldodev 73 | // LinkedIn: linkedin.com/in/rinaldodev 74 | // Twitch: twitch.tv/rinaldodev 75 | // GitHub: github.com/rinaldodev 76 | // Facebook: facebook.com/rinaldodev 77 | // Site: rinaldo.dev 78 | 79 | /* 80 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 81 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 82 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 83 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/behavioral/TemplateMethod_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.behavioral; 2 | 3 | /** 4 | * Java Design Patterns - Template Method (2) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class TemplateMethod_2 { 9 | 10 | public static void main(String[] args) { 11 | ProcessadorPagamento2 processadorPagamento = new ProcessadorPagamentoCredito2(); 12 | processadorPagamento.processarPagamento(); 13 | } 14 | 15 | } 16 | 17 | //---------------------------------------------------- 18 | 19 | abstract class ProcessadorPagamento2 { 20 | 21 | // template method 22 | public void processarPagamento() { 23 | preparar(); 24 | validar(); 25 | debitar(); 26 | notificar(); 27 | notificarAdicional(); 28 | finalizar(); 29 | finalizarAdicional(); 30 | } 31 | 32 | protected abstract void debitar(); 33 | 34 | private void preparar() { 35 | System.out.println("Reservando produtos"); 36 | } 37 | 38 | private void validar() { 39 | System.out.println("Validando cadastro"); 40 | } 41 | 42 | private void notificar() { 43 | System.out.println("Notificando usuário"); 44 | } 45 | 46 | private void finalizar() { 47 | System.out.println("Finalizando compra"); 48 | } 49 | 50 | protected void notificarAdicional() { 51 | // vazio 52 | } 53 | 54 | protected void finalizarAdicional() { 55 | // vazio 56 | } 57 | 58 | } 59 | 60 | //---------------------------------------------------- 61 | 62 | class ProcessadorPagamentoCredito2 extends ProcessadorPagamento2 { 63 | 64 | @Override 65 | protected void debitar() { 66 | System.out.println("Debitando.."); 67 | } 68 | 69 | @Override 70 | protected void notificarAdicional() { 71 | System.out.println("Notificações adicionais.."); 72 | } 73 | 74 | // @Override 75 | // protected void finalizarAdicional() { 76 | // System.out.println("Finalização adicional.."); 77 | // } 78 | 79 | } 80 | 81 | //---------------------------------------------------- 82 | 83 | // Twitter: twitter.com/rinaldodev 84 | // LinkedIn: linkedin.com/in/rinaldodev 85 | // Twitch: twitch.tv/rinaldodev 86 | // GitHub: github.com/rinaldodev 87 | // Facebook: facebook.com/rinaldodev 88 | // Site: rinaldo.dev 89 | 90 | /* 91 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 92 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 93 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 94 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/FactoryMethod_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Factory Method (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class FactoryMethod_1 { 9 | 10 | // Criador Abstrato 11 | // Produto Abstrato 12 | // Criador Concreto 13 | // Produto Concreto 14 | 15 | @SuppressWarnings("unused") 16 | public static void main(String[] args) { 17 | Categoria categoria = new Digital(); 18 | Produto produto = categoria.novoProduto(); 19 | } 20 | 21 | } 22 | 23 | interface Produto { 24 | } 25 | 26 | class ProdutoDigital implements Produto { 27 | } 28 | 29 | class ProdutoFisico implements Produto { 30 | } 31 | 32 | interface Categoria { 33 | Produto novoProduto(); 34 | } 35 | 36 | class Digital implements Categoria { 37 | @Override 38 | public Produto novoProduto() { 39 | // ... 40 | return new ProdutoDigital(); 41 | } 42 | } 43 | 44 | class Fisico implements Categoria { 45 | @Override 46 | public Produto novoProduto() { 47 | // ... 48 | return new ProdutoFisico(); 49 | } 50 | } 51 | 52 | // Mais flex�vel para cria��o de objetos 53 | // Permite trabalhar com hierarquias paralelas 54 | 55 | // Twitter: twitter.com/rinaldodev 56 | // LinkedIn: linkedin.com/in/rinaldodev 57 | // Twitch: twitch.tv/rinaldodev 58 | // GitHub: github.com/rinaldodev 59 | // Facebook: facebook.com/rinaldodev 60 | // Site: rinaldo.dev 61 | -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/FactoryMethod_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Factory Method (2) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class FactoryMethod_2 { 9 | 10 | // Criador Concreto 11 | // Produto Abstrato 12 | // Produto Concreto 13 | 14 | @SuppressWarnings("unused") 15 | public static void main(String[] args) { 16 | Categoria2 categoria2 = new Categoria2(); 17 | Produto2 produto2 = categoria2.novoProduto(); 18 | } 19 | 20 | } 21 | 22 | interface Produto2 { 23 | } 24 | 25 | class ProdutoDigital2 implements Produto2 { 26 | } 27 | 28 | class ProdutoFisico2 implements Produto2 { 29 | } 30 | 31 | class Categoria2 { 32 | 33 | // private String nome; 34 | // private Tipo tipo; 35 | // private Integer prioridade; 36 | 37 | public Produto2 novoProduto() { 38 | // ... 39 | return new ProdutoFisico2(); 40 | } 41 | } 42 | 43 | class CategoriaDigital extends Categoria2 { 44 | public Produto2 novoProduto() { 45 | // ... 46 | return new ProdutoDigital2(); 47 | } 48 | } 49 | 50 | // Twitter: twitter.com/rinaldodev 51 | // LinkedIn: linkedin.com/in/rinaldodev 52 | // Twitch: twitch.tv/rinaldodev 53 | // GitHub: github.com/rinaldodev 54 | // Facebook: facebook.com/rinaldodev 55 | // Site: rinaldo.dev 56 | -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/FactoryMethod_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Factory Method (3) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class FactoryMethod_3 { 9 | 10 | // Produto -> ProdutoFactory 11 | // ProcessadorPagamento -> ProcessadorPagamentoFactory 12 | 13 | // Criador concreto com parâmetro 14 | // Produto Abstrato 15 | // Produto concreto 16 | 17 | @SuppressWarnings("unused") 18 | public static void main(String[] args) { 19 | Categoria3 categoria3 = new Categoria3(); 20 | Produto3 produto3 = categoria3.novoProduto(1); 21 | } 22 | 23 | } 24 | 25 | interface Produto3 { 26 | } 27 | 28 | class ProdutoPadrao3 implements Produto3 { 29 | } 30 | 31 | class ProdutoDigital3 extends ProdutoPadrao3 { 32 | } 33 | 34 | class ProdutoFisico3 extends ProdutoPadrao3 { 35 | } 36 | 37 | class Categoria3 { 38 | // private String nome; 39 | // private Integer prioridade; 40 | 41 | // ... 42 | 43 | public Produto3 novoProduto(int tipoProduto) { 44 | switch (tipoProduto) { 45 | case 1: 46 | return new ProdutoPadrao3(); 47 | case 2: 48 | return new ProdutoDigital3(); 49 | case 3: 50 | return new ProdutoFisico3(); 51 | default: 52 | throw new IllegalArgumentException(); 53 | } 54 | } 55 | } 56 | 57 | // Twitter: twitter.com/rinaldodev 58 | // LinkedIn: linkedin.com/in/rinaldodev 59 | // Twitch: twitch.tv/rinaldodev 60 | // GitHub: github.com/rinaldodev 61 | // Facebook: facebook.com/rinaldodev 62 | // Site: rinaldo.dev 63 | -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/FactoryMethod_4.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | import java.text.NumberFormat; 4 | import java.util.Calendar; 5 | import java.util.List; 6 | import java.util.stream.Stream; 7 | 8 | /** 9 | * Java Design Patterns - Factory Method (4) 10 | * 11 | * @author youtube.com/RinaldoDev 12 | */ 13 | public class FactoryMethod_4 { 14 | 15 | // Virtual constructor 16 | 17 | public static void main(String[] args) { 18 | // Static Factory Methods 19 | Calendar.getInstance(); 20 | NumberFormat.getInstance(); 21 | Stream.of(1, 2, 3, 4); 22 | List.of(1, 2, 3, 4); 23 | Integer valueOf = Integer.valueOf("1234"); 24 | } 25 | 26 | } 27 | // Twitter: twitter.com/rinaldodev 28 | // LinkedIn: linkedin.com/in/rinaldodev/ 29 | // Twitch: twitch.tv/rinaldodev 30 | // GitHub: github.com/rinaldodev 31 | // Facebook: facebook.com/rinaldodev/ 32 | // Site: rinaldo.dev -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/Singleton_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Singleton (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Singleton_1 { 9 | 10 | public static void main(String[] args) { 11 | // ProdutoFactory.INSTANCE.novoProduto(1); 12 | // ProdutoFactory.INSTANCE.novoProduto(2); 13 | // ProdutoFactory.INSTANCE.novoProduto(3); 14 | ProdutoFactory.getInstance().novoProduto(1); 15 | ProdutoFactory.getInstance().novoProduto(2); 16 | ProdutoFactory.getInstance().novoProduto(3); 17 | } 18 | 19 | } 20 | 21 | interface Produto4 { 22 | } 23 | 24 | class ProdutoPadrao4 implements Produto4 { 25 | } 26 | 27 | class ProdutoDigital4 extends ProdutoPadrao4 { 28 | } 29 | 30 | class ProdutoFisico4 extends ProdutoPadrao4 { 31 | } 32 | 33 | //---------------------------------------------------- 34 | // ProdutoFactory.java 35 | class ProdutoFactory { 36 | // public static final ProdutoFactory INSTANCE = new ProdutoFactory(); 37 | private static ProdutoFactory instance; 38 | 39 | private ProdutoFactory() { 40 | } 41 | 42 | // public static synchronized ProdutoFactory getInstance() { 43 | public static ProdutoFactory getInstance() { 44 | if (instance == null) { 45 | instance = new ProdutoFactory(); 46 | } 47 | return instance; 48 | } 49 | 50 | public Produto4 novoProduto(int tipoProduto) { 51 | switch (tipoProduto) { 52 | case 1: 53 | return new ProdutoPadrao4(); 54 | case 2: 55 | return new ProdutoDigital4(); 56 | case 3: 57 | return new ProdutoFisico4(); 58 | default: 59 | throw new IllegalArgumentException(); 60 | } 61 | } 62 | } 63 | 64 | // Twitter: twitter.com/rinaldodev 65 | // LinkedIn: linkedin.com/in/rinaldodev 66 | // Twitch: twitch.tv/rinaldodev 67 | // GitHub: github.com/rinaldodev 68 | // Facebook: facebook.com/rinaldodev 69 | // Site: rinaldo.dev 70 | 71 | /* 72 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 73 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 74 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 75 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/Singleton_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Singleton (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Singleton_2 { 9 | 10 | public static void main(String[] args) { 11 | ProdutoFactory2.INSTANCE.novoProduto(0); 12 | } 13 | 14 | } 15 | 16 | interface Produto5 { 17 | } 18 | 19 | class ProdutoPadrao5 implements Produto5 { 20 | } 21 | 22 | class ProdutoDigital5 extends ProdutoPadrao5 { 23 | } 24 | 25 | class ProdutoFisico5 extends ProdutoPadrao5 { 26 | } 27 | 28 | //---------------------------------------------------- 29 | // ProdutoFactory.java 30 | enum ProdutoFactory2 { 31 | INSTANCE; 32 | 33 | public Produto5 novoProduto(int tipoProduto) { 34 | switch (tipoProduto) { 35 | case 1: 36 | return new ProdutoPadrao5(); 37 | case 2: 38 | return new ProdutoDigital5(); 39 | case 3: 40 | return new ProdutoFisico5(); 41 | default: 42 | throw new IllegalArgumentException(); 43 | } 44 | } 45 | } 46 | 47 | // Twitter: twitter.com/rinaldodev 48 | // LinkedIn: linkedin.com/in/rinaldodev 49 | // Twitch: twitch.tv/rinaldodev 50 | // GitHub: github.com/rinaldodev 51 | // Facebook: facebook.com/rinaldodev 52 | // Site: rinaldo.dev 53 | 54 | /* 55 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 56 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 57 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 58 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/creational/Singleton_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.creational; 2 | 3 | /** 4 | * Java Design Patterns - Singleton (3) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Singleton_3 { 9 | 10 | public static void main(String[] args) { 11 | } 12 | 13 | } 14 | 15 | //---------------------------------------------------- 16 | // ConfiguracaoAplicacao.java 17 | class ConfiguracaoAplicacao { 18 | private static ConfiguracaoAplicacao instance; 19 | 20 | public String nomeAplicacao; 21 | public String versao; 22 | public String cor; 23 | 24 | protected ConfiguracaoAplicacao() { 25 | this.nomeAplicacao = "Singleton"; 26 | this.versao = "3.0"; 27 | this.cor = "Azul"; 28 | } 29 | 30 | // parâmetro jvm 31 | // mapa - registro dos singletons 32 | // classpath 33 | 34 | public ConfiguracaoAplicacao getInstance() { 35 | if (instance == null) { 36 | String configuracao = System.getProperty("class.configuracao"); 37 | if (configuracao == "teste") { 38 | instance = new ConfiguracaoAplicacaoTeste(); 39 | } 40 | instance = new ConfiguracaoAplicacao(); 41 | } 42 | return instance; 43 | } 44 | 45 | } 46 | 47 | //---------------------------------------------------- 48 | class ConfiguracaoAplicacaoTeste extends ConfiguracaoAplicacao { 49 | 50 | protected ConfiguracaoAplicacaoTeste() { 51 | this.nomeAplicacao = "Singleton Teste"; 52 | this.versao = "3.0"; 53 | this.cor = "Vermelho"; 54 | } 55 | 56 | } 57 | 58 | // Twitter: twitter.com/rinaldodev 59 | // LinkedIn: linkedin.com/in/rinaldodev 60 | // Twitch: twitch.tv/rinaldodev 61 | // GitHub: github.com/rinaldodev 62 | // Facebook: facebook.com/rinaldodev 63 | // Site: rinaldo.dev 64 | 65 | /* 66 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 67 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 68 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 69 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Adapter_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Adapter (1) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Adapter_1 { 11 | 12 | // Client 13 | // Adapter 14 | // Adaptee 15 | 16 | public static void main(String[] args) { 17 | MeuPagamentoCredito credito = new MeuPagamentoCredito(); 18 | credito.debitar(new BigDecimal("100")); 19 | } 20 | 21 | } 22 | 23 | // ---------------------------------------------------- 24 | 25 | class MeuPagamentoCredito { // você tem acesso! é sua! 26 | 27 | SdkPagamentoCredito sdkPagamentoCredito = new SdkPagamentoCredito(); 28 | 29 | public void debitar(BigDecimal valor) { 30 | sdkPagamentoCredito.autorizar(valor); 31 | sdkPagamentoCredito.capturar(valor); 32 | } 33 | 34 | public void creditar(BigDecimal valor) { 35 | sdkPagamentoCredito.creditar(valor); 36 | } 37 | 38 | } 39 | 40 | //---------------------------------------------------- 41 | 42 | class SdkPagamentoCredito { // sdk fechada! você não tem acesso! 43 | 44 | public void autorizar(BigDecimal valor) { 45 | // autoriza 46 | } 47 | 48 | public void capturar(BigDecimal valor) { 49 | // captura 50 | } 51 | 52 | public void creditar(BigDecimal valor) { 53 | // credita 54 | } 55 | 56 | } 57 | 58 | /* 59 | * twitter.com/rinaldodev 60 | * linkedin.com/in/rinaldodev 61 | * twitch.tv/rinaldodev 62 | * github.com/rinaldodev 63 | * facebook.com/rinaldodev 64 | * www.rinaldo.dev 65 | */ 66 | 67 | /* 68 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 69 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 70 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 71 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Adapter_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Adapter (2) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Adapter_2 { 11 | 12 | // Client 13 | // Adapter 14 | // Adaptee 15 | // Target 16 | 17 | public static void main(String[] args) { 18 | ProcessorPagamento2 credito = new MeuPagamentoCredito2(); 19 | credito.debitar(new BigDecimal("100")); 20 | } 21 | 22 | } 23 | 24 | //---------------------------------------------------- 25 | 26 | interface ProcessorPagamento2 { 27 | 28 | void debitar(BigDecimal valor); 29 | 30 | void creditar(BigDecimal valor); 31 | 32 | } 33 | 34 | //---------------------------------------------------- 35 | 36 | class MeuPagamentoCredito2 implements ProcessorPagamento2 { 37 | 38 | SdkPagamentoCredito2 sdkPagamentoCredito = new SdkPagamentoCredito2(); 39 | 40 | // .. 41 | 42 | public void debitar(BigDecimal valor) { 43 | // .. 44 | sdkPagamentoCredito.autorizar(valor); 45 | sdkPagamentoCredito.capturar(valor); 46 | } 47 | 48 | public void creditar(BigDecimal valor) { 49 | // .. 50 | sdkPagamentoCredito.creditar(valor); 51 | } 52 | 53 | } 54 | 55 | //---------------------------------------------------- 56 | 57 | class SdkPagamentoCredito2 { // .jar / lib no maven 58 | 59 | // posso até ter acesso, mas não convém alterar 60 | 61 | void autorizar(BigDecimal valor) { 62 | // autoriza 63 | } 64 | 65 | void capturar(BigDecimal valor) { 66 | // captura 67 | } 68 | 69 | void creditar(BigDecimal valor) { 70 | // credita 71 | } 72 | 73 | } 74 | 75 | /* 76 | * / 77 | * twitter.com/rinaldodev 78 | * linkedin.com/in/rinaldodev 79 | * twitch.tv/rinaldodev 80 | * github.com/rinaldodev 81 | * facebook.com/rinaldodev 82 | * www.rinaldo.dev 83 | * / 84 | */ 85 | 86 | /* 87 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 88 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 89 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 90 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Adapter_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * Java Design Patterns - Adapter (3) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Adapter_3 { 11 | 12 | public static void main(String[] args) { 13 | MeuPagamentoCredito3 credito = new MeuPagamentoCredito3(); 14 | credito.debitar(new BigDecimal("100")); 15 | } 16 | 17 | } 18 | 19 | //---------------------------------------------------- 20 | 21 | interface ProcessorPagamento3 { 22 | 23 | void debitar(BigDecimal valor); 24 | 25 | void creditar(BigDecimal valor); 26 | 27 | } 28 | 29 | //---------------------------------------------------- 30 | 31 | class MeuPagamentoCredito3 extends SdkPagamentoCredito3 32 | implements ProcessorPagamento3 { 33 | 34 | // ... 35 | 36 | public void debitar(BigDecimal valor) { 37 | super.autorizar(valor); 38 | super.capturar(valor); 39 | } 40 | 41 | public void creditar(BigDecimal valor) { 42 | super.creditar(valor); 43 | } 44 | 45 | // @Override 46 | // void autorizar(BigDecimal valor) { 47 | // // mudou o comportamento - não é mais two-way 48 | // } 49 | 50 | } 51 | 52 | //---------------------------------------------------- 53 | 54 | class SdkPagamentoCredito3 { 55 | 56 | void autorizar(BigDecimal valor) { 57 | // autoriza 58 | } 59 | 60 | void capturar(BigDecimal valor) { 61 | // captura 62 | } 63 | 64 | void creditar(BigDecimal valor) { 65 | // credita 66 | } 67 | 68 | } 69 | 70 | /* 71 | * / 72 | * twitter.com/rinaldodev 73 | * linkedin.com/in/rinaldodev 74 | * twitch.tv/rinaldodev 75 | * github.com/rinaldodev 76 | * facebook.com/rinaldodev 77 | * www.rinaldo.dev 78 | * / 79 | */ 80 | 81 | /* 82 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 83 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 84 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 85 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Decorator_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Decorator (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Decorator_1 { 9 | 10 | public static void main(String[] args) { 11 | Endereco endereco = new Endereco("Rua 4 Casa 123", "Centro", "São José", "RN", "50930-123"); 12 | 13 | EnderecadorSimples enderecador = new EnderecadorSimples(); 14 | EnderecadorCaixaAlta enderecadorCaixaAlta = new EnderecadorCaixaAlta(enderecador); 15 | 16 | String enderecoFormatado = enderecadorCaixaAlta.preparaEndereco(endereco); 17 | 18 | System.out.println(enderecoFormatado); 19 | } 20 | 21 | } 22 | 23 | //---------------------------------------------------- 24 | 25 | class Endereco { 26 | final String logradouro; 27 | final String bairro; 28 | final String cidade; 29 | final String uf; 30 | final String cep; 31 | 32 | public Endereco(String logradouro, String bairro, String cidade, String uf, String cep) { 33 | super(); 34 | this.logradouro = logradouro; 35 | this.bairro = bairro; 36 | this.cidade = cidade; 37 | this.uf = uf; 38 | this.cep = cep; 39 | } 40 | } 41 | 42 | //---------------------------------------------------- 43 | 44 | class EnderecadorSimples { 45 | public String preparaEndereco(Endereco endereco) { 46 | StringBuilder sb = new StringBuilder(); 47 | sb.append(endereco.logradouro); 48 | sb.append("\n"); 49 | sb.append(endereco.bairro); 50 | sb.append("\n"); 51 | sb.append(endereco.cidade); 52 | sb.append('/'); 53 | sb.append(endereco.uf); 54 | sb.append("\n"); 55 | sb.append(endereco.cep); 56 | return sb.toString(); 57 | } 58 | } 59 | 60 | //---------------------------------------------------- 61 | // Decorator 62 | 63 | class EnderecadorCaixaAlta { 64 | 65 | EnderecadorSimples enderecador; 66 | 67 | public EnderecadorCaixaAlta(EnderecadorSimples enderecador) { 68 | super(); 69 | this.enderecador = enderecador; 70 | } 71 | 72 | public String preparaEndereco(Endereco endereco) { 73 | return enderecador.preparaEndereco(endereco).toUpperCase(); 74 | } 75 | } 76 | 77 | // Twitter: twitter.com/rinaldodev 78 | // LinkedIn: linkedin.com/in/rinaldodev 79 | // Twitch: twitch.tv/rinaldodev 80 | // GitHub: github.com/rinaldodev 81 | // Facebook: facebook.com/rinaldodev 82 | // Site: rinaldo.dev 83 | 84 | /* 85 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 86 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 87 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 88 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Decorator_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Decorator (2) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Decorator_2 { 9 | 10 | public static void main(String[] args) { 11 | Endereco2 endereco = new Endereco2("Rua 4 Casa 123", "Centro", "São José", "RN", "50930-123"); 12 | 13 | Enderecador2 enderecador = new EnderecadorSimples2(); 14 | enderecador = new EnderecadorCaixaAlta2(enderecador); 15 | 16 | String enderecoFormatado = enderecador.preparaEndereco(endereco); 17 | 18 | System.out.println(enderecoFormatado); 19 | } 20 | 21 | } 22 | 23 | //---------------------------------------------------- 24 | 25 | class Endereco2 { 26 | final String logradouro; 27 | final String bairro; 28 | final String cidade; 29 | final String uf; 30 | final String cep; 31 | 32 | public Endereco2(String logradouro, String bairro, String cidade, String uf, String cep) { 33 | super(); 34 | this.logradouro = logradouro; 35 | this.bairro = bairro; 36 | this.cidade = cidade; 37 | this.uf = uf; 38 | this.cep = cep; 39 | } 40 | } 41 | 42 | //---------------------------------------------------- 43 | 44 | interface Enderecador2 { 45 | String preparaEndereco(Endereco2 endereco); 46 | } 47 | 48 | //---------------------------------------------------- 49 | 50 | class EnderecadorSimples2 implements Enderecador2 { 51 | public String preparaEndereco(Endereco2 endereco) { 52 | StringBuilder sb = new StringBuilder(); 53 | sb.append(endereco.logradouro); 54 | sb.append("\n"); 55 | sb.append(endereco.bairro); 56 | sb.append("\n"); 57 | sb.append(endereco.cidade); 58 | sb.append('/'); 59 | sb.append(endereco.uf); 60 | sb.append("\n"); 61 | sb.append(endereco.cep); 62 | return sb.toString(); 63 | } 64 | } 65 | 66 | //---------------------------------------------------- 67 | 68 | class EnderecadorCaixaAlta2 implements Enderecador2 { 69 | 70 | Enderecador2 enderecador; 71 | 72 | public EnderecadorCaixaAlta2(Enderecador2 enderecador) { 73 | super(); 74 | this.enderecador = enderecador; 75 | } 76 | 77 | public String preparaEndereco(Endereco2 endereco) { 78 | return enderecador.preparaEndereco(endereco).toUpperCase(); 79 | } 80 | } 81 | 82 | // Twitter: twitter.com/rinaldodev 83 | // LinkedIn: linkedin.com/in/rinaldodev 84 | // Twitch: twitch.tv/rinaldodev 85 | // GitHub: github.com/rinaldodev 86 | // Facebook: facebook.com/rinaldodev 87 | // Site: rinaldo.dev 88 | 89 | /* 90 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 91 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 92 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 93 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Decorator_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Decorator (3) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Decorator_3 { 9 | 10 | public static void main(String[] args) { 11 | Endereco3 endereco = new Endereco3("Rua 4 Casa 133", "Centro", "São José", "RN", "50930-133"); 12 | 13 | Enderecador3 enderecador = new EnderecadorSimples3(); 14 | enderecador = new EnderecadorCaixaAlta3(enderecador); 15 | enderecador = new EnderecadorComBorda3(enderecador); 16 | 17 | String enderecoFormatado = enderecador.preparaEndereco(endereco); 18 | 19 | System.out.println(enderecoFormatado); 20 | } 21 | 22 | } 23 | 24 | //---------------------------------------------------- 25 | 26 | class Endereco3 { 27 | final String logradouro; 28 | final String bairro; 29 | final String cidade; 30 | final String uf; 31 | final String cep; 32 | 33 | public Endereco3(String logradouro, String bairro, String cidade, String uf, String cep) { 34 | super(); 35 | this.logradouro = logradouro; 36 | this.bairro = bairro; 37 | this.cidade = cidade; 38 | this.uf = uf; 39 | this.cep = cep; 40 | } 41 | } 42 | 43 | //---------------------------------------------------- 44 | 45 | interface Enderecador3 { 46 | String preparaEndereco(Endereco3 endereco); 47 | } 48 | 49 | //---------------------------------------------------- 50 | 51 | class EnderecadorSimples3 implements Enderecador3 { 52 | public String preparaEndereco(Endereco3 endereco) { 53 | StringBuilder sb = new StringBuilder(); 54 | sb.append(endereco.logradouro); 55 | sb.append("\n"); 56 | sb.append(endereco.bairro); 57 | sb.append("\n"); 58 | sb.append(endereco.cidade); 59 | sb.append('/'); 60 | sb.append(endereco.uf); 61 | sb.append("\n"); 62 | sb.append(endereco.cep); 63 | return sb.toString(); 64 | } 65 | } 66 | 67 | //---------------------------------------------------- 68 | 69 | class EnderecadorCaixaAlta3 implements Enderecador3 { 70 | 71 | Enderecador3 enderecador; 72 | 73 | public EnderecadorCaixaAlta3(Enderecador3 enderecador) { 74 | super(); 75 | this.enderecador = enderecador; 76 | } 77 | 78 | public String preparaEndereco(Endereco3 endereco) { 79 | return enderecador.preparaEndereco(endereco).toUpperCase(); 80 | } 81 | } 82 | 83 | //---------------------------------------------------- 84 | 85 | class EnderecadorComBorda3 implements Enderecador3 { 86 | 87 | Enderecador3 enderecador; 88 | 89 | public EnderecadorComBorda3(Enderecador3 enderecador) { 90 | super(); 91 | this.enderecador = enderecador; 92 | } 93 | 94 | public String preparaEndereco(Endereco3 endereco) { 95 | String preparaEndereco = enderecador.preparaEndereco(endereco); 96 | StringBuilder sb = new StringBuilder(); 97 | sb.append("---------------------\n"); 98 | preparaEndereco.lines().forEach(l -> sb.append("| " + l + "\n")); 99 | sb.append("---------------------"); 100 | return sb.toString(); 101 | } 102 | } 103 | 104 | // Twitter: twitter.com/rinaldodev 105 | // LinkedIn: linkedin.com/in/rinaldodev 106 | // Twitch: twitch.tv/rinaldodev 107 | // GitHub: github.com/rinaldodev 108 | // Facebook: facebook.com/rinaldodev 109 | // Site: rinaldo.dev 110 | 111 | /* 112 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 113 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 114 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 115 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Decorator_4.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Decorator (4) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Decorator_4 { 9 | 10 | public static void main(String[] args) { 11 | Endereco4 endereco = new Endereco4("Rua 4 Casa 144", "Centro", "São José", "RN", "50940-144"); 12 | 13 | Enderecador4 enderecador = new EnderecadorSimples4(); 14 | enderecador = new EnderecadorCaixaAlta4(enderecador); 15 | enderecador = new EnderecadorComBorda4(enderecador); 16 | 17 | String enderecoFormatado = enderecador.preparaEndereco(endereco); 18 | 19 | System.out.println(enderecoFormatado); 20 | } 21 | 22 | } 23 | 24 | //---------------------------------------------------- 25 | 26 | class Endereco4 { 27 | final String logradouro; 28 | final String bairro; 29 | final String cidade; 30 | final String uf; 31 | final String cep; 32 | 33 | public Endereco4(String logradouro, String bairro, String cidade, String uf, String cep) { 34 | super(); 35 | this.logradouro = logradouro; 36 | this.bairro = bairro; 37 | this.cidade = cidade; 38 | this.uf = uf; 39 | this.cep = cep; 40 | } 41 | } 42 | 43 | //---------------------------------------------------- 44 | 45 | interface Enderecador4 { 46 | String preparaEndereco(Endereco4 endereco); 47 | } 48 | 49 | //---------------------------------------------------- 50 | 51 | class EnderecadorSimples4 implements Enderecador4 { 52 | public String preparaEndereco(Endereco4 endereco) { 53 | StringBuilder sb = new StringBuilder(); 54 | sb.append(endereco.logradouro); 55 | sb.append("\n"); 56 | sb.append(endereco.bairro); 57 | sb.append("\n"); 58 | sb.append(endereco.cidade); 59 | sb.append('/'); 60 | sb.append(endereco.uf); 61 | sb.append("\n"); 62 | sb.append(endereco.cep); 63 | return sb.toString(); 64 | } 65 | } 66 | 67 | //---------------------------------------------------- 68 | 69 | abstract class EnderecadorDecorator implements Enderecador4 { 70 | Enderecador4 enderecador; 71 | 72 | public EnderecadorDecorator(Enderecador4 enderecador) { 73 | super(); 74 | this.enderecador = enderecador; 75 | } 76 | } 77 | 78 | //---------------------------------------------------- 79 | 80 | class EnderecadorCaixaAlta4 extends EnderecadorDecorator { 81 | 82 | public EnderecadorCaixaAlta4(Enderecador4 enderecador) { 83 | super(enderecador); 84 | } 85 | 86 | public String preparaEndereco(Endereco4 endereco) { 87 | return enderecador.preparaEndereco(endereco).toUpperCase(); 88 | } 89 | 90 | } 91 | 92 | //---------------------------------------------------- 93 | 94 | class EnderecadorComBorda4 extends EnderecadorDecorator { 95 | 96 | public EnderecadorComBorda4(Enderecador4 enderecador) { 97 | super(enderecador); 98 | } 99 | 100 | public String preparaEndereco(Endereco4 endereco) { 101 | String preparaEndereco = enderecador.preparaEndereco(endereco); 102 | StringBuilder sb = new StringBuilder(); 103 | sb.append("---------------------\n"); 104 | preparaEndereco.lines().forEach(l -> sb.append("| " + l + "\n")); 105 | sb.append("---------------------"); 106 | return sb.toString(); 107 | } 108 | } 109 | 110 | // Twitter: twitter.com/rinaldodev 111 | // LinkedIn: linkedin.com/in/rinaldodev 112 | // Twitch: twitch.tv/rinaldodev 113 | // GitHub: github.com/rinaldodev 114 | // Facebook: facebook.com/rinaldodev 115 | // Site: rinaldo.dev 116 | 117 | /* 118 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 119 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 120 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 121 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Proxy_1.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Proxy (1) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Proxy_1 { 9 | 10 | // RealSubject / Implementação 11 | // Proxy 12 | 13 | public static void main(String[] args) { 14 | // ProdutoDAO produtoDAO = new ProdutoDAO(); 15 | ProdutoDAO produtoDAO = new LogProdutoDAO(); 16 | ProdutoService produtoService = new ProdutoService(produtoDAO); 17 | 18 | produtoService.buscarProduto(1); 19 | produtoService.buscarProduto(2); 20 | produtoService.buscarProduto(3); 21 | } 22 | 23 | } 24 | 25 | //---------------------------------------------------- 26 | 27 | class ProdutoService { 28 | 29 | private ProdutoDAO produtoDAO; 30 | 31 | public ProdutoService(ProdutoDAO produtoDAO) { 32 | this.produtoDAO = produtoDAO; 33 | } 34 | 35 | public Object buscarProduto(long id) { 36 | return produtoDAO.find(id); 37 | } 38 | 39 | } 40 | 41 | //---------------------------------------------------- 42 | 43 | class ProdutoDAO { 44 | 45 | public ProdutoDAO() { 46 | simulaTempoAlto(); 47 | } 48 | 49 | public Object find(long id) { 50 | // Busca produto e retorna 51 | simulaTempoAlto(); 52 | return new Object(); 53 | } 54 | 55 | private void simulaTempoAlto() { 56 | try { 57 | // Cria conexão com o banco 58 | Thread.sleep(1000); 59 | } catch (InterruptedException e) { 60 | e.printStackTrace(); 61 | } 62 | } 63 | 64 | } 65 | 66 | //---------------------------------------------------- 67 | 68 | // Não mexi no Cliente 69 | // Não mexi na Implementação original 70 | // Herança 71 | 72 | class LogProdutoDAO extends ProdutoDAO { 73 | 74 | @Override 75 | public Object find(long id) { 76 | System.out.println("Buscando produto com id " + id); 77 | Object find = super.find(id); 78 | System.out.println("Buscando produto com id " + id); 79 | return find; 80 | } 81 | 82 | } 83 | 84 | 85 | // Twitter: twitter.com/rinaldodev 86 | // LinkedIn: linkedin.com/in/rinaldodev 87 | // Twitch: twitch.tv/rinaldodev 88 | // GitHub: github.com/rinaldodev 89 | // Facebook: facebook.com/rinaldodev 90 | // Site: rinaldo.dev 91 | 92 | /* 93 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 94 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 95 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 96 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Proxy_2.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | import java.util.HashMap; 4 | 5 | /** 6 | * Java Design Patterns - Proxy (2) 7 | * 8 | * @author youtube.com/RinaldoDev 9 | */ 10 | public class Proxy_2 { 11 | 12 | // RealSubject / Implementação 13 | // Proxy 14 | 15 | public static void main(String[] args) { 16 | // ProdutoDAO2 produtoDAO = new ProdutoDAO2(); 17 | ProdutoDAO2 produtoDAO = new CacheProdutoDAO2(); 18 | ProdutoService2 produtoService = new ProdutoService2(produtoDAO); 19 | 20 | produtoService.buscarProduto(1); 21 | produtoService.buscarProduto(1); 22 | produtoService.buscarProduto(1); 23 | } 24 | 25 | } 26 | 27 | //---------------------------------------------------- 28 | 29 | class ProdutoService2 { 30 | 31 | private ProdutoDAO2 produtoDAO; 32 | 33 | public ProdutoService2(ProdutoDAO2 produtoDAO) { 34 | this.produtoDAO = produtoDAO; 35 | } 36 | 37 | public Object buscarProduto(long id) { 38 | return produtoDAO.find(id); 39 | } 40 | 41 | } 42 | 43 | //---------------------------------------------------- 44 | 45 | class ProdutoDAO2 { 46 | 47 | public ProdutoDAO2() { 48 | simulaTempoAlto(); 49 | } 50 | 51 | public Object find(long id) { 52 | // Busca produto e retorna 53 | System.out.println("Busca objeto na base."); 54 | simulaTempoAlto(); 55 | return new Object(); 56 | } 57 | 58 | private void simulaTempoAlto() { 59 | try { 60 | // Cria conexão com o banco 61 | Thread.sleep(1000); 62 | } catch (InterruptedException e) { 63 | e.printStackTrace(); 64 | } 65 | } 66 | 67 | } 68 | 69 | //---------------------------------------------------- 70 | 71 | //Não mexi no Cliente 72 | //Não mexi na Implementação original 73 | //Herança 74 | 75 | class CacheProdutoDAO2 extends ProdutoDAO2 { 76 | 77 | private static final HashMap CACHE = new HashMap<>(); 78 | 79 | @Override 80 | public Object find(long id) { 81 | Object o = CACHE.get(id); 82 | if (o == null) { 83 | o = super.find(id); 84 | CACHE.put(id, o); 85 | return o; 86 | } 87 | System.out.println("Busca objeto no cache."); 88 | return o; 89 | } 90 | 91 | } 92 | 93 | // Exemplos 94 | // @Inject / @AutoWired / @EJB 95 | // RMI / java.rmi - Remote Method Invocation 96 | 97 | 98 | // Twitter: twitter.com/rinaldodev 99 | // LinkedIn: linkedin.com/in/rinaldodev 100 | // Twitch: twitch.tv/rinaldodev 101 | // GitHub: github.com/rinaldodev 102 | // Facebook: facebook.com/rinaldodev 103 | // Site: rinaldo.dev 104 | 105 | /* 106 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 107 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 108 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 109 | */ -------------------------------------------------------------------------------- /src/main/java/dev/rinaldo/designpatterns/structural/Proxy_3.java: -------------------------------------------------------------------------------- 1 | package dev.rinaldo.designpatterns.structural; 2 | 3 | /** 4 | * Java Design Patterns - Proxy (3) 5 | * 6 | * @author youtube.com/RinaldoDev 7 | */ 8 | public class Proxy_3 { 9 | 10 | // RealSubject / Implementação - ProdutoDAO3 11 | // Proxy - LazyProdutoDAO3 12 | // Subject - Interface 13 | 14 | public static void main(String[] args) { 15 | // IProdutoDAO3 produtoDAO = new ProdutoDAO3(); 16 | IProdutoDAO3 produtoDAO = new LazyProdutoDAO3(); 17 | ProdutoService3 produtoService = new ProdutoService3(produtoDAO); 18 | System.out.println("Produto service criado."); 19 | // produtoService.buscarProduto(1); 20 | // produtoService.buscarProduto(2); 21 | // produtoService.buscarProduto(3); 22 | } 23 | 24 | } 25 | 26 | //---------------------------------------------------- 27 | 28 | class ProdutoService3 { 29 | 30 | private IProdutoDAO3 produtoDAO; 31 | 32 | public ProdutoService3(IProdutoDAO3 produtoDAO) { 33 | this.produtoDAO = produtoDAO; 34 | } 35 | 36 | public Object buscarProduto(long id) { 37 | return produtoDAO.find(id); 38 | } 39 | 40 | } 41 | 42 | //---------------------------------------------------- 43 | 44 | interface IProdutoDAO3 { 45 | 46 | Object find(long id); 47 | 48 | } 49 | 50 | //---------------------------------------------------- 51 | 52 | class ProdutoDAO3 implements IProdutoDAO3 { 53 | 54 | public ProdutoDAO3() { 55 | System.out.println("Criando conexão com o banco."); 56 | simulaTempoAlto(); 57 | } 58 | 59 | public Object find(long id) { 60 | // Busca produto e retorna 61 | simulaTempoAlto(); 62 | return new Object(); 63 | } 64 | 65 | private void simulaTempoAlto() { 66 | try { 67 | // Cria conexão com o banco 68 | Thread.sleep(1000); 69 | } catch (InterruptedException e) { 70 | e.printStackTrace(); 71 | } 72 | } 73 | 74 | } 75 | 76 | //---------------------------------------------------- 77 | 78 | // Composição 79 | 80 | // Escolher entre composição (interface) ou herança 81 | 82 | class LazyProdutoDAO3 implements IProdutoDAO3 { 83 | 84 | private IProdutoDAO3 daoReal; 85 | 86 | @Override 87 | public Object find(long id) { 88 | inicializaDAO(); 89 | return daoReal.find(id); 90 | } 91 | 92 | private void inicializaDAO() { 93 | if (daoReal == null) { 94 | daoReal = new ProdutoDAO3(); 95 | } 96 | } 97 | 98 | } 99 | 100 | // Twitter: twitter.com/rinaldodev 101 | // LinkedIn: linkedin.com/in/rinaldodev 102 | // Twitch: twitch.tv/rinaldodev 103 | // GitHub: github.com/rinaldodev 104 | // Facebook: facebook.com/rinaldodev 105 | // Site: rinaldo.dev 106 | 107 | /* 108 | * ATENÇÃO: Esse arquivo é um material que acompanha a explicação em vídeo no YouTube. Não se baseie nesse exemplo para copiar e 109 | * colar diretamente no seu código sem anter entender do que se trata. Nem todas as boas práticas estão sendo aplicadas aqui, e 110 | * muitas coisas são omitidas por uma questão didática. Assista o vídeo completo no canal RinaldoDev no YouTube. 111 | */ -------------------------------------------------------------------------------- /src/main/java/diagrama.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 40 | 41 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/main/resources/FactoryMethod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinaldodev/design-patterns/eb521ed28819e356c818f3a12f98386abb9cf763/src/main/resources/FactoryMethod --------------------------------------------------------------------------------