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