Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: mcmp lists 2021.2 #76

Open
wants to merge 423 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
423 commits
Select commit Hold shift + click to select a range
620192a
IHC
akeme Oct 11, 2019
87bd0ff
Novos arquivos
fcolucas Oct 11, 2019
fe3e998
add novos arquivos redes e iaa
fcolucas Oct 11, 2019
6f4e941
Merge pull request #1 from engcomAndre/ORG_S1
engcomAndre Oct 13, 2019
d152dd4
Merge pull request #2 from engcomAndre/ORG_S3_S4
engcomAndre Oct 13, 2019
526a8b4
Merge pull request #3 from engcomAndre/ORG_S5_S6
engcomAndre Oct 13, 2019
38523e6
update
engcomAndre Oct 13, 2019
d06b4e9
organizando S1 e S2
engcomAndre Oct 13, 2019
fd8112a
organizando s1 e s2 e adição de arquivos
engcomAndre Oct 13, 2019
c1772c4
init
engcomAndre Oct 13, 2019
02f47ee
Merge branch 'master' of https://github.com/engcomAndre/provas into O…
engcomAndre Oct 13, 2019
3fd14fe
renomeando pastas
engcomAndre Oct 13, 2019
dd855e8
revisando e adicionando
engcomAndre Oct 13, 2019
9775ca3
...
engcomAndre Oct 13, 2019
c7a890c
Merge branch 'master' of https://github.com/engcomAndre/provas
engcomAndre Oct 13, 2019
4cc780e
renomeando
engcomAndre Oct 13, 2019
7672383
s5 ok
engcomAndre Oct 13, 2019
43264b8
renomeando s6
engcomAndre Oct 13, 2019
afa81b4
add exemplo de codigo comentado
engcomAndre Oct 13, 2019
a226cec
Merge pull request #4 from engcomAndre/ORG_S7_S8
engcomAndre Oct 13, 2019
3f8c8fb
Merge pull request #5 from engcomAndre/ORG_S9_S10
engcomAndre Oct 13, 2019
2c05a75
Merge pull request #6 from engcomAndre/ORG_S9_S10
engcomAndre Oct 13, 2019
f2969db
renomeando e adicionando disciplinas
engcomAndre Oct 13, 2019
51eb0b6
atualizando gitgnore
engcomAndre Oct 13, 2019
ec0f885
adicionando Gerenciamento de Projetos
engcomAndre Oct 13, 2019
03aab9a
adicionando conteudo de str
engcomAndre Oct 13, 2019
42f611a
adicionando material a S7 e S8
engcomAndre Oct 13, 2019
4baebe4
adicionando em PPD
engcomAndre Oct 13, 2019
a52222a
adicionando em TCC
engcomAndre Oct 13, 2019
0999213
...
engcomAndre Oct 13, 2019
775c402
adicionado PUDS
engcomAndre Oct 13, 2019
6607611
Merge pull request #42 from akeme/master
Oct 14, 2019
6841cec
Merge pull request #43 from fcolucas/master
Oct 14, 2019
f325ad7
Merge pull request #44 from engcomAndre/ORG_S1
Oct 14, 2019
f5bbe82
Merge pull request #45 from engcomAndre/ORG_S3_S4
Oct 14, 2019
5e44710
Merge pull request #46 from engcomAndre/ORG_S5_S6
Oct 14, 2019
959b8b5
Merge pull request #47 from engcomAndre/ORG_S7_S8
Oct 14, 2019
d4722fe
Merge pull request #49 from engcomAndre/ORG_S9_S10
Oct 14, 2019
a11494a
Merge pull request #50 from engcomAndre/PUDS
Oct 14, 2019
689576c
probest 2019.2
Hilbertmf Oct 26, 2019
4eaec13
Merge pull request #51 from Hilbertmf/master
Oct 29, 2019
aa35259
Merge pull request #1 from CAECOMP/master
Oct 30, 2019
188c089
Add files via upload
MarcusCavalcante Feb 1, 2020
e676ff7
Add files via upload
MarcusCavalcante Feb 1, 2020
becb223
Add files via upload
MarcusCavalcante Feb 1, 2020
32981ff
add opt instrumentacao
engcomAndre Oct 5, 2020
40e6775
renomeando instrumentacao
engcomAndre Oct 5, 2020
97580ad
add cadeira opt ger projetos
engcomAndre Oct 5, 2020
080f4e2
add eletronica industrial
engcomAndre Oct 5, 2020
e923104
Add Cálculo Numérico 2020.1
thalysviana Oct 19, 2020
4b15e19
Add Cálculo Numérico 2020.1
thalysviana Oct 19, 2020
0c8c648
Merge pull request #56 from thalysviana/master
Oct 31, 2020
0540411
Merge pull request #55 from engcomAndre/CAD_ELE_INDUSTRIAL
Oct 31, 2020
02f266c
Merge pull request #52 from MarcusCavalcante/master
Oct 31, 2020
46fcc97
Merge pull request #53 from engcomAndre/CAD_INTRUMENTACAO
Oct 31, 2020
e3aadd2
Merge pull request #54 from engcomAndre/CAD_GER_PROJETOS
Oct 31, 2020
740b524
semb updates
Mar 9, 2021
e4013bc
Merge pull request #57 from RennanRbs/master
tavares1 Mar 9, 2021
aec2fcc
DB de questões
raynan222 Mar 9, 2021
a3647cf
nome
raynan222 Mar 9, 2021
7749931
Create 2020.2 - Cidcley
fcolucas Mar 12, 2021
b662fbc
Delete 2020.2 - Cidcley
fcolucas Mar 12, 2021
a55eaeb
Create arquivo
fcolucas Mar 12, 2021
67328fb
Add provas de SD
fcolucas Mar 12, 2021
f51d8a0
Delete arquivo
fcolucas Mar 12, 2021
959a872
Create arquivo
fcolucas Mar 12, 2021
26096db
Add files via upload
fcolucas Mar 12, 2021
fbe4584
Delete arquivo
fcolucas Mar 12, 2021
c4c63eb
Create arquivo
fcolucas Mar 12, 2021
e070672
Add provas IAA
fcolucas Mar 12, 2021
ece6cd0
Delete arquivo
fcolucas Mar 12, 2021
cb2e848
Create arquivo
fcolucas Mar 12, 2021
119f5b1
Delete Sistemas Embarcados 1/2020.1 - Elias directory
fcolucas Mar 12, 2021
dd17e36
Create S05 - [OPT]Sistemas Multimídia
JJggccmm Jul 28, 2021
5c279cb
Delete S05 - [OPT]Sistemas Multimídia
JJggccmm Jul 28, 2021
c6dce3b
Create LEIA-ME!
JJggccmm Jul 28, 2021
e117b5b
Delete S05 - [OPT]Sistemas Multimídia! directory
JJggccmm Jul 28, 2021
faedac5
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
de61ef8
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
56fd5c9
Create LEIA-ME!
JJggccmm Jul 28, 2021
0a24151
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
d01e259
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
19a06e3
Add files via upload
JJggccmm Jul 28, 2021
e721ae9
Add files via upload
JJggccmm Jul 28, 2021
ddcde57
Add files via upload
JJggccmm Jul 28, 2021
64862fd
Add files via upload
JJggccmm Jul 28, 2021
850d9ab
Add files via upload
JJggccmm Jul 28, 2021
3619a3c
Add files via upload
JJggccmm Jul 28, 2021
8360cb6
Delete ATIVID~1.PDF
JJggccmm Jul 28, 2021
ad14750
Add files via upload
JJggccmm Jul 28, 2021
f976c86
Add files via upload
JJggccmm Jul 28, 2021
74ff144
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
be133f5
Add files via upload
JJggccmm Jul 28, 2021
05528b4
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
127e3df
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
90bb8d8
Add files via upload
JJggccmm Jul 28, 2021
ca05ec4
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
9a72a72
Add files via upload
JJggccmm Jul 28, 2021
628db99
Add files via upload
JJggccmm Jul 28, 2021
3c5ba6a
Add files via upload
JJggccmm Jul 28, 2021
46fa50c
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
1d23940
Add files via upload
JJggccmm Jul 28, 2021
653022a
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
cfda26f
Add files via upload
JJggccmm Jul 28, 2021
af3d579
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
972a11c
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
3b2041b
Add files via upload
JJggccmm Jul 28, 2021
cad1803
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
fa153f2
Add files via upload
JJggccmm Jul 28, 2021
8990b09
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
a353227
Add files via upload
JJggccmm Jul 28, 2021
a44570d
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
4fc599b
Add files via upload
JJggccmm Jul 28, 2021
88dfc41
Create LEIA-ME.txt
JJggccmm Jul 28, 2021
9fc64e4
Delete S07 - Computação Gráfica/2018.1 Lucas Souza/2021.1 - Ajalmar …
JJggccmm Jul 28, 2021
24efde8
Add files via upload
JJggccmm Jul 28, 2021
17db662
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
373bcac
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
858dfbe
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
4ef800a
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
be0f5e5
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
8f38077
Delete LEIA-ME!
JJggccmm Jul 28, 2021
a380a21
Delete LEIA-ME.txt
JJggccmm Jul 28, 2021
9c08f70
Merge pull request #58 from raynan222/master
Aug 3, 2021
af9e145
Merge pull request #59 from fcolucas/master
Aug 3, 2021
3232ef8
Merge pull request #60 from Numbess/master
Aug 3, 2021
6a02d85
Inclusão dos códigos da cadeira de padrões de projeto 2020.2
Italo-Silva Oct 31, 2021
bc6a0b4
Merge pull request #61 from ItaloBruno/master
alynnefs Oct 31, 2021
939a081
Adicionando Provas de 2022.1 e o trabalho da N2
rochabianca Jul 6, 2022
9c36b18
Create O que é essa pasta?.txt
JJggccmm Aug 30, 2022
b9e08fc
Create AVISOS IMPORTANTES!.txt
JJggccmm Aug 30, 2022
7d7ca78
Add files via upload
JJggccmm Aug 30, 2022
51f5793
Update AVISOS IMPORTANTES!.txt
JJggccmm Aug 30, 2022
2a0373f
Add files via upload
JJggccmm Aug 30, 2022
dd665fe
Create AVISOS IMPORTANTES!.txt
JJggccmm Aug 30, 2022
0aa50b6
Add files via upload
JJggccmm Aug 30, 2022
ae0b5b7
Create Explicando essa pasta.txt
JJggccmm Aug 30, 2022
ceaa429
Add files via upload
JJggccmm Aug 30, 2022
4e5a7a6
Create O que tem de novo nessa pasta?
JJggccmm Aug 30, 2022
ad44964
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
43b7316
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
82664fd
Add files via upload
JJggccmm Aug 30, 2022
5f4a28b
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
f4a71cc
Add files via upload
JJggccmm Aug 30, 2022
6016637
Add files via upload
JJggccmm Aug 30, 2022
0a0bb80
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
587d2f6
Add files via upload
JJggccmm Aug 30, 2022
0118587
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
8e4175c
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
31adb68
Add files via upload
JJggccmm Aug 30, 2022
29ebce9
Create Sobre essa pasta.txt
JJggccmm Aug 30, 2022
dc6892a
Add files via upload
JJggccmm Aug 30, 2022
520283f
Add files via upload
JJggccmm Aug 30, 2022
b12ad15
Add files via upload
JJggccmm Aug 30, 2022
23d6d9f
Add files via upload
JJggccmm Aug 30, 2022
e0da004
Add files via upload
JJggccmm Aug 30, 2022
386fbb0
Add files via upload
JJggccmm Aug 30, 2022
affb412
Delete SL - 1a Prova ETAPA 2.jpeg
JJggccmm Aug 30, 2022
cee7da7
Add files via upload
JJggccmm Aug 30, 2022
7159b56
Merge pull request #63 from Numbess/master
alynnefs Aug 31, 2022
1fa3c09
Creating folder
raquelmcoelho Sep 8, 2022
d1a3e49
Adding files via upload
raquelmcoelho Sep 8, 2022
e0e4f90
Delete create.txt
raquelmcoelho Sep 8, 2022
47c4a1f
Creating folder
raquelmcoelho Sep 8, 2022
83e193c
Adding files
raquelmcoelho Sep 8, 2022
27a3e8e
Delete create.txt
raquelmcoelho Sep 8, 2022
2b3ad79
Create create.txt
raquelmcoelho Sep 8, 2022
657a835
Add files via upload
raquelmcoelho Sep 8, 2022
e193715
Delete create.txt
raquelmcoelho Sep 8, 2022
33ab033
Create create.txt
raquelmcoelho Sep 8, 2022
981b63c
Add files via upload
raquelmcoelho Sep 8, 2022
f85aea9
Delete create.txt
raquelmcoelho Sep 8, 2022
ed2d670
Create README.md
raquelmcoelho Sep 8, 2022
d23ca21
Update README.md
raquelmcoelho Sep 8, 2022
355f66e
Update README.md
raquelmcoelho Sep 8, 2022
62d1cc8
Merge pull request #62 from rochabianca/master
caio11pessoa Sep 13, 2022
cf19d82
Merge pull request #64 from raquelmcoelho/master
caio11pessoa Sep 13, 2022
2331772
Prova N1 Probabilidade e Estatística
mateuzin Oct 16, 2022
2a79aae
Prova de redes nidia 2022.2
mateuzin Oct 16, 2022
77cdb9c
Merge pull request #65 from mateuzin/master
caio11pessoa Oct 18, 2022
e5da00a
Prova de Engenharia de Software 2022.1
mateuzin Oct 19, 2022
ee6ce10
Merge pull request #66 from mateuzin/master
caio11pessoa Oct 19, 2022
81f0f1a
Atividades PO-Ronaldo
ffelipealves Oct 21, 2022
72e8925
Adicionando pasta com arquivo de MCMP 2021.2
mateuzin Oct 21, 2022
c27b847
Adicionando Q2 da Lista 2
mateuzin Oct 21, 2022
4301663
So arrumando o nome do arquivo
mateuzin Oct 21, 2022
e46c99e
Q2 + pattern do proteus
mateuzin Oct 21, 2022
093e381
Q3-LISTA 2 , pattern proteus + cod
mateuzin Oct 21, 2022
1247ffd
Q1 E Q4-LISTA2, pattern proteus + Codigo
mateuzin Oct 21, 2022
382c7a4
Merge pull request #67 from ffelipealves/master
caio11pessoa Oct 24, 2022
8efe446
Merge pull request #68 from mateuzin/master
caio11pessoa Oct 24, 2022
8e8b60a
add lista de revisão de conteúdo - ATC 2022.2
paul0henrique Dec 17, 2022
bd5eef4
add dicas arquitetura de computadores
paul0henrique Dec 27, 2022
5703210
Merge pull request #69 from paul0henrique/master
caio11pessoa Dec 27, 2022
51a0478
Add novos arquivos de provas e conteúdos.
JJggccmm Jan 2, 2023
15a211e
Add provas do semestre!
JJggccmm Jan 2, 2023
261b019
Add materiais N1!
JJggccmm Jan 2, 2023
5124147
Add materiais!
JJggccmm Jan 2, 2023
ddc5240
Add conteudos da N2!
JJggccmm Jan 2, 2023
f02d994
Add materiais N2!
JJggccmm Jan 2, 2023
736e9ee
Deletando pasta desnecessária...
JJggccmm Jan 2, 2023
121d2e8
Deletando pasta desnecessária...
JJggccmm Jan 2, 2023
fef428b
Add arquivos usados no trabalho final da N2!
JJggccmm Jan 2, 2023
c7de107
Add arquivos usados no trab!
JJggccmm Jan 2, 2023
fabbfd8
Add arquivos da cadeira em 2022.2!
JJggccmm Jan 2, 2023
060d037
Add arquivos!
JJggccmm Jan 2, 2023
9b19fed
Add arquivos!
JJggccmm Jan 2, 2023
63a9d1d
Add arquivos!
JJggccmm Jan 2, 2023
f711271
Add add
JJggccmm Jan 2, 2023
ac9c8f2
Add add
JJggccmm Jan 2, 2023
0e59c34
Add arquvios!
JJggccmm Jan 2, 2023
3dbabd1
aaaa
JJggccmm Jan 2, 2023
5ba3825
Add arquivos
JJggccmm Jan 2, 2023
3b0e471
Deletando arquivo inutil...
JJggccmm Jan 2, 2023
e0370c4
meme
JJggccmm Jan 2, 2023
8243d46
Deletando arquivo desnecessário...
JJggccmm Jan 2, 2023
108798d
Add n° 23
JJggccmm Jan 2, 2023
b13a428
Merge pull request #70 from CAECOMP/master
JJggccmm Jan 2, 2023
84f8fad
Deletando arquivo
JJggccmm Feb 25, 2023
d51d36e
Deletando arquivo.
JJggccmm Feb 25, 2023
41f167b
''Re-adicionando''
JJggccmm Feb 25, 2023
e55f9b3
Deletando link do drive quebrado.
JJggccmm Apr 4, 2023
f488fbd
Organizando arquivos.
JJggccmm Apr 7, 2023
1f7af38
Organizando arquivos.
JJggccmm Apr 7, 2023
9bd0dc1
Organizando arquivos.
JJggccmm Apr 7, 2023
56514e6
Organizando arquivos.
JJggccmm Apr 7, 2023
72e752f
Organizando arquivos.
JJggccmm Apr 7, 2023
ff01ac4
Organizando arquivos.
JJggccmm Apr 7, 2023
7f9107e
Organizando arquivos.
JJggccmm Apr 7, 2023
ff33c81
Organizando arquivos.
JJggccmm Apr 7, 2023
7ff736b
Organizando arquivos.
JJggccmm Apr 7, 2023
b141d3e
Cisco modulo 1 ao 10
AIWASS23 Apr 12, 2023
32fe2df
CN n1
AIWASS23 Apr 12, 2023
e3fa90a
Libras
AIWASS23 Apr 14, 2023
6cdd1c4
EDO no EAD
AIWASS23 Apr 14, 2023
32643e7
Merge pull request #71 from AIWASS23/master
caio11pessoa Apr 18, 2023
15b4efb
Estruturas de dados com o Alisson
AIWASS23 Apr 20, 2023
3c37a2a
Update ed_18_05.py
AIWASS23 Apr 20, 2023
7fb22c1
Update hackerrank.py
AIWASS23 Apr 20, 2023
a15f7d7
Merge pull request #72 from AIWASS23/master
caio11pessoa Apr 20, 2023
194d247
Deletando
JJggccmm Apr 27, 2023
1ae10e7
Deletando
JJggccmm Apr 27, 2023
3f5eb4e
Consertando arquivos.
JJggccmm Apr 27, 2023
c5f0190
Create RESUMO N2
Icar0S Jun 29, 2023
71ae091
Update RESUMO N2
Icar0S Jun 29, 2023
03ce856
Add files via upload
AIWASS23 Jul 4, 2023
6b7b937
Merge pull request #74 from AIWASS23/master
caio11pessoa Nov 27, 2023
a137b97
Merge pull request #73 from Icar0S/patch-1
caio11pessoa Nov 27, 2023
074a040
adicionando prova de POO de 2023.2 da n1
KelvinLR Jan 31, 2024
478f780
docs: mcmp lists 2021.1
jbrun0r Feb 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Inclusão dos códigos da cadeira de padrões de projeto 2020.2
Italo-Silva committed Oct 31, 2021
commit 6a02d85ecf2138bc793fa46abaad868f2381e426
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.vscode
__pycache__
4 changes: 4 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/Readme.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Abstract Factory

Exemplo escrito em python e baseado no do [
Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto [Abstract Factory](https://refactoring.guru/pt-br/design-patterns/abstract-factory).
18 changes: 18 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/computador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from abc import ABC, abstractmethod
from teclado import TecladoAbstrato


class ComputadorAbstrato(ABC):
@abstractmethod
def detalhes_do_hardware(self) -> str:
pass


class ComputadorModeloA(ComputadorAbstrato):
def detalhes_do_hardware(self) -> str:
return "Processador Core 2 + 8G Memória RAM + 1Tb de ssd"


class ComputadorModeloB(ComputadorAbstrato):
def detalhes_do_hardware(self) -> str:
return "Processador Core 8 + 16G Memória RAM + 2Tb de ssd"
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/fabrica.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from abc import ABC, abstractmethod
from computador import ComputadorAbstrato, ComputadorModeloA, ComputadorModeloB
from teclado import TecladoAbstrato, TecladoModeloA, TecladoModeloB


class FabricaAbstrataKit(ABC):
@abstractmethod
def criar_computador(self) -> ComputadorAbstrato:
pass

@abstractmethod
def criar_teclado(self) -> TecladoAbstrato:
pass


class Kit1(FabricaAbstrataKit):
def criar_computador(self) -> ComputadorAbstrato:
return ComputadorModeloA()

def criar_teclado(self) -> TecladoAbstrato:
return TecladoModeloA()


class Kit2(FabricaAbstrataKit):
def criar_computador(self) -> ComputadorAbstrato:
return ComputadorModeloB()

def criar_teclado(self) -> TecladoAbstrato:
return TecladoModeloB()
22 changes: 22 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from fabrica import FabricaAbstrataKit, Kit1, Kit2


def kit_do_cliente(kit: FabricaAbstrataKit) -> None:

computador = kit.criar_computador()
teclado = kit.criar_teclado()

print(f"{computador.detalhes_do_hardware()}")
print(f"{teclado.detalhes()}")


if __name__ == "__main__":
print("Testando o primeiro tipo de factory")
print("Detalhes do kit 1")
kit_do_cliente(Kit1())

print("\n")

print("Mesmo cliente só que estando o segundo tipo de factory")
print("Detalhes do kit 2")
kit_do_cliente(Kit2())
17 changes: 17 additions & 0 deletions S08 - Padrões de projeto/abstract_factory/teclado.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from abc import ABC, abstractmethod


class TecladoAbstrato(ABC):
@abstractmethod
def detalhes(self) -> str:
pass


class TecladoModeloA(TecladoAbstrato):
def detalhes(self) -> str:
return "Teclado de membrana"


class TecladoModeloB(TecladoAbstrato):
def detalhes(self) -> str:
return "Teclado mecânico"
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/adapter/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/adapter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# adapter

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Adapter](https://www.youtube.com/watch?v=qG286LQM6BU)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
16 changes: 16 additions & 0 deletions S08 - Padrões de projeto/adapter/adaptador_robo_inimigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from interface_atacante_inimigo import AtacanteInimigo
from robo_inimigo import RoboInimigo


class AdaptadorRoboInimigo(AtacanteInimigo):
def __init__(self, robo: RoboInimigo):
self.robo: RoboInimigo = robo

def atirar(self) -> None:
self.robo.esmagar_com_as_maos()

def seguir_em_frente(self) -> None:
self.robo.ande_para_frente()

def atribuir_motorista(self, nome_motorista: str) -> None:
self.robo.reagir_ao_humano(nome_motorista=nome_motorista)
15 changes: 15 additions & 0 deletions S08 - Padrões de projeto/adapter/interface_atacante_inimigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from abc import abstractmethod, ABC


class AtacanteInimigo(ABC):
@abstractmethod
def atirar(self) -> None:
pass

@abstractmethod
def seguir_em_frente(self) -> None:
pass

@abstractmethod
def atribuir_motorista(self, nome_motorista: str) -> None:
pass
24 changes: 24 additions & 0 deletions S08 - Padrões de projeto/adapter/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from tanque_inimigo import TanqueInimigo
from robo_inimigo import RoboInimigo
from adaptador_robo_inimigo import AdaptadorRoboInimigo


if __name__ == "__main__":
tanque_rx7: TanqueInimigo = TanqueInimigo()
fred: RoboInimigo = RoboInimigo()
adaptador: AdaptadorRoboInimigo = AdaptadorRoboInimigo(fred)

print("O robô...")
fred.reagir_ao_humano("Paul")
fred.ande_para_frente()
fred.esmagar_com_as_maos()

print("\nO tanque inimigo...")
tanque_rx7.atribuir_motorista("Frank")
tanque_rx7.seguir_em_frente()
tanque_rx7.atirar()

print("\nO robô com o adaptador...")
adaptador.atribuir_motorista("Mark")
adaptador.seguir_em_frente()
adaptador.atirar()
18 changes: 18 additions & 0 deletions S08 - Padrões de projeto/adapter/robo_inimigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from random import randint


class RoboInimigo:
def __init__(self):
self.dano = 0
self.movimento = 0

def esmagar_com_as_maos(self):
self.dano = randint(1, 10)
print(f"O robô iminigo causa {self.dano} de dano com suas mãos")

def ande_para_frente(self):
self.movimento = randint(1, 5)
print(f"O robô iminigo anda {self.movimento} casas para frente")

def reagir_ao_humano(self, nome_motorista):
print(f"O robô inimigo vai para cima do {nome_motorista}")
19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/adapter/tanque_inimigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from interface_atacante_inimigo import AtacanteInimigo
from random import randint


class TanqueInimigo(AtacanteInimigo):
def __init__(self):
self.dano: int = 0
self.movimento: int = 0

def atirar(self) -> None:
self.dano: int = randint(1, 10)
print(f"O tanque causa {self.dano} de dano")

def seguir_em_frente(self) -> None:
self.movimento = randint(1, 5)
print(f"O tanque se moveu {self.movimento} casas")

def atribuir_motorista(self, nome_motorista: str) -> None:
print(f"{nome_motorista} está dirigindo o tanque")
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/bridge/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/bridge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# bridge

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Facade](https://www.youtube.com/watch?v=9jIgSsIfh_8)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
23 changes: 23 additions & 0 deletions S08 - Padrões de projeto/bridge/botao_remoto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from abc import ABC, abstractmethod
from dispositivo_de_entretenimento import DispositivoDeEntretenimento


class BotaoRemoto(ABC):
def __init__(self, dispositivo: DispositivoDeEntretenimento):
self._dispositivo = dispositivo

@abstractmethod
def botao_cinco_pressionado(self):
self._dispositivo.botao_cinco_pressionado()

@abstractmethod
def botao_seis_pressionado(self):
self._dispositivo.botao_seis_pressionado()

@abstractmethod
def feedback_do_dispositivo(self):
self._dispositivo.feedback_do_dispositivo()

@abstractmethod
def botao_nove_pressionado(self):
pass
33 changes: 33 additions & 0 deletions S08 - Padrões de projeto/bridge/dispositivo_de_entretenimento.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from abc import ABC, abstractmethod


class DispositivoDeEntretenimento(ABC):
def __init__(self):
self.estado_do_dispositivo = 0
self.configuracao_maxima = 0
self.volume = 0

@abstractmethod
def botao_cinco_pressionado(self):
pass

@abstractmethod
def botao_seis_pressionado(self):
pass

@abstractmethod
def botao_sete_pressionado(self):
self.volume += 1
print(f"Volume em {self.volume}")

@abstractmethod
def botao_oito_pressionado(self):
self.volume -= 1
print(f"Volume em {self.volume}")

@abstractmethod
def feedback_do_dispositivo(self):
if self.estado_do_dispositivo > self.configuracao_maxima or self.estado_do_dispositivo < 0:
self.estado_do_dispositivo = 0

print(f"No canal {self.estado_do_dispositivo}")
21 changes: 21 additions & 0 deletions S08 - Padrões de projeto/bridge/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from tv_remoto_mudo import TvRemotaMuda
from tv_remoto_pausa import TvRemotaPausa
from tv import Tv

if __name__ == '__main__':
botao_remoto_tv_1 = TvRemotaMuda(Tv(1, 200))
botao_remoto_tv_2 = TvRemotaPausa(Tv(1, 200))

print("Teste da tv mutada")
botao_remoto_tv_1.botao_cinco_pressionado()
botao_remoto_tv_1.botao_seis_pressionado()
botao_remoto_tv_1.botao_nove_pressionado()

print("\nTeste da tv pausada")
botao_remoto_tv_2.botao_cinco_pressionado()
botao_remoto_tv_2.botao_seis_pressionado()
botao_remoto_tv_2.botao_seis_pressionado()
botao_remoto_tv_2.botao_seis_pressionado()
botao_remoto_tv_2.botao_seis_pressionado()
botao_remoto_tv_2.botao_nove_pressionado()
botao_remoto_tv_2.feedback_do_dispositivo()
26 changes: 26 additions & 0 deletions S08 - Padrões de projeto/bridge/tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from dispositivo_de_entretenimento import DispositivoDeEntretenimento


class Tv(DispositivoDeEntretenimento):
def __init__(self, estado_do_dispositivo: int, configuracao_maxima: int):
super().__init__()
self.estado_do_dispositivo = estado_do_dispositivo
self.configuracao_maxima = configuracao_maxima

def botao_cinco_pressionado(self):
print("Diminuindo o canal")
self.estado_do_dispositivo -= 1

def botao_seis_pressionado(self):
print("Aumentando o canal")
self.estado_do_dispositivo += 1

def botao_sete_pressionado(self):
super(Tv, self).botao_sete_pressionado()

def botao_oito_pressionado(self):
super(Tv, self).botao_oito_pressionado()

def feedback_do_dispositivo(self):
super(Tv, self).feedback_do_dispositivo()

19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/bridge/tv_remoto_mudo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from botao_remoto import BotaoRemoto
from dispositivo_de_entretenimento import DispositivoDeEntretenimento


class TvRemotaMuda(BotaoRemoto):
def botao_cinco_pressionado(self):
super(TvRemotaMuda, self).botao_cinco_pressionado()

def botao_seis_pressionado(self):
super(TvRemotaMuda, self).botao_seis_pressionado()

def feedback_do_dispositivo(self):
super(TvRemotaMuda, self).feedback_do_dispositivo()

def __init__(self, dispotivo: DispositivoDeEntretenimento):
super().__init__(dispositivo=dispotivo)

def botao_nove_pressionado(self):
print(f"A tv foi mutada")
19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/bridge/tv_remoto_pausa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from botao_remoto import BotaoRemoto
from dispositivo_de_entretenimento import DispositivoDeEntretenimento


class TvRemotaPausa(BotaoRemoto):
def botao_cinco_pressionado(self):
super(TvRemotaPausa, self).botao_cinco_pressionado()

def botao_seis_pressionado(self):
super(TvRemotaPausa, self).botao_seis_pressionado()

def feedback_do_dispositivo(self):
super(TvRemotaPausa, self).feedback_do_dispositivo()

def __init__(self, dispotivo: DispositivoDeEntretenimento):
super().__init__(dispositivo=dispotivo)

def botao_nove_pressionado(self):
print(f"A tv foi pausada")
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/builder/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/builder/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# builder

O código desse repositório foi feito em python e é baseado no [vídeo do Derek Banas sobre o padrão de projeto Builder](https://www.youtube.com/watch?v=9XnsOpjclUg&feature=emb_logo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site [Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/builder/construtor_robo_antigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from interface_construtor_robo import InterfaceConstrutorRobo
from robo import Robo


class ConstrutorRoboAntigo(InterfaceConstrutorRobo):
_robo: Robo

def __init__(self):
self.resetar()

def criar_cabeca_robo(self) -> None:
self._robo.criar_cabeca("cabeça de lata")

def criar_tronco_robo(self) -> None:
self._robo.criar_troco("tronco de lata")

def criar_bracos_robo(self) -> None:
self._robo.criar_bracos("braços de maçarico")

def criar_pernas_robo(self) -> None:
self._robo.criar_pernas("pernas de patins")

def resetar(self) -> None:
self._robo = Robo()

def retornar_robo_criado(self) -> Robo:
robo_pronto = self._robo
self.resetar()
return robo_pronto
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/builder/construtor_robo_moderno.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from interface_construtor_robo import InterfaceConstrutorRobo
from robo import Robo


class ConstrutorRoboModerno(InterfaceConstrutorRobo):
_robo: Robo

def __init__(self):
self.resetar()

def criar_cabeca_robo(self) -> None:
self._robo.criar_cabeca("cabeça de fibra de carbono")

def criar_tronco_robo(self) -> None:
self._robo.criar_troco("tronco de fibra de carbono")

def criar_bracos_robo(self) -> None:
self._robo.criar_bracos("braços de fibra de carbono")

def criar_pernas_robo(self) -> None:
self._robo.criar_pernas("pernas de fibra de carbono")

def resetar(self) -> None:
self._robo = Robo()

def retornar_robo_criado(self) -> Robo:
robo_pronto = self._robo
self.resetar()
return robo_pronto
23 changes: 23 additions & 0 deletions S08 - Padrões de projeto/builder/diretor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from interface_robo import InterfaceRobo
from interface_construtor_robo import InterfaceConstrutorRobo
from robo import Robo


class Diretor:
_construtor: InterfaceConstrutorRobo

def __init__(self, construtor_de_robo: InterfaceConstrutorRobo):
self.definir_construtor(construtor_de_robo)

def definir_construtor(self, construtor_de_robo: InterfaceConstrutorRobo):
self._construtor = construtor_de_robo

def criar_robo(self) -> Robo:
self._construtor.criar_cabeca_robo()
self._construtor.criar_tronco_robo()
self._construtor.criar_bracos_robo()
self._construtor.criar_pernas_robo()

def retornar_robo_criado(self) -> Robo:
return self._construtor.retornar_robo_criado()

29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/builder/interface_construtor_robo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from abc import ABC, abstractmethod
from robo import Robo


class InterfaceConstrutorRobo(ABC):
@abstractmethod
def criar_cabeca_robo(self) -> None:
pass

@abstractmethod
def criar_tronco_robo(self) -> None:
pass

@abstractmethod
def criar_bracos_robo(self) -> None:
pass

@abstractmethod
def criar_pernas_robo(self) -> None:
pass

@abstractmethod
def resetar(self) -> None:
pass

@abstractmethod
def retornar_robo_criado(self) -> Robo:
pass

19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/builder/interface_robo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from abc import ABC, abstractmethod


class InterfaceRobo(ABC):
@abstractmethod
def criar_cabeca(self, cabeca: str) -> None:
pass

@abstractmethod
def criar_troco(self, tronco: str) -> None:
pass

@abstractmethod
def criar_bracos(self, bracos: str) -> None:
pass

@abstractmethod
def criar_pernas(self, pernas: str) -> None:
pass
25 changes: 25 additions & 0 deletions S08 - Padrões de projeto/builder/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from construtor_robo_antigo import ConstrutorRoboAntigo
from construtor_robo_moderno import ConstrutorRoboModerno
from diretor import Diretor


if __name__ == "__main__":
construtor = ConstrutorRoboAntigo()
diretor = Diretor(construtor_de_robo=construtor)
diretor.criar_robo()
robo_criado = diretor.retornar_robo_criado()

print("Robo antigo criado:")
print(robo_criado)

construtor = ConstrutorRoboModerno()
diretor.definir_construtor(construtor)
diretor.criar_robo()
robo_criado = diretor.retornar_robo_criado()

print("\nRobo moderno criado:")
print(robo_criado)




39 changes: 39 additions & 0 deletions S08 - Padrões de projeto/builder/robo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from interface_robo import InterfaceRobo


class Robo(InterfaceRobo):
_cabeca: str
_tronco: str
_bracos: str
_pernas: str

def __str__(self) -> str:
return f"cabeça: {self._cabeca}\ntronco: {self._tronco}\nbracos: {self._bracos}\npernas: {self._pernas}"

def criar_cabeca(self, cabeca: str) -> None:
self._cabeca = cabeca

def criar_troco(self, tronco: str) -> None:
self._tronco = tronco

def criar_bracos(self, bracos: str) -> None:
self._bracos = bracos

def criar_pernas(self, pernas: str) -> None:
self._pernas = pernas

@property
def cabeca(self) -> str:
return self._cabeca

@property
def tronco(self) -> str:
return self._tronco

@property
def bracos(self) -> str:
return self._cabeca

@property
def pernas(self) -> str:
return self._pernas
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/chain_of_responsibility/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# chain of responsibility

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Chain of Responsibility](https://www.youtube.com/watch?v=jDX6x8qmjbA)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from interface_cadeia import Cadeia
from numeros import Numeros


class DividirNumeros(Cadeia):
def __init__(self):
self._proximo_na_cadeia: Cadeia = None

def definir_proximo_na_cadeia(self, proxima_cadeia: Cadeia):
self._proximo_na_cadeia = proxima_cadeia

def calcular(self, requisicao: Numeros):
if requisicao.calculo_desejado == "dividir":
print(f"{requisicao.numero_1} / {requisicao.numero_2} = {requisicao.numero_1 / requisicao.numero_2}")
else:
print("As operações disponíveis até o momento são somar, subtrair, multiplicar e dividir")

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from abc import ABC, abstractmethod
from numeros import Numeros


class Cadeia(ABC):
@abstractmethod
def definir_proximo_na_cadeia(self, proxima_cadeia: "Cadeia"):
pass

@abstractmethod
def calcular(self, requisicao: Numeros):
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from interface_cadeia import Cadeia
from numeros import Numeros


class MultiplicarNumeros(Cadeia):
def __init__(self):
self._proximo_na_cadeia: Cadeia = None

def definir_proximo_na_cadeia(self, proxima_cadeia: Cadeia):
self._proximo_na_cadeia = proxima_cadeia

def calcular(self, requisicao: Numeros):
if requisicao.calculo_desejado == "multiplicar":
print(f"{requisicao.numero_1} * {requisicao.numero_2} = {requisicao.numero_1 * requisicao.numero_2}")
else:
self._proximo_na_cadeia.calcular(requisicao=requisicao)

17 changes: 17 additions & 0 deletions S08 - Padrões de projeto/chain_of_responsibility/numeros.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Numeros:
def __init__(self, numero_1: int, numero_2: int, calculo_desejado: str):
self._numero_1: int = numero_1
self._numero_2: int = numero_2
self._calculo_desejado: str = calculo_desejado

@property
def numero_1(self) -> int:
return self._numero_1

@property
def numero_2(self) -> int:
return self._numero_2

@property
def calculo_desejado(self) -> str:
return self._calculo_desejado
37 changes: 37 additions & 0 deletions S08 - Padrões de projeto/chain_of_responsibility/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from somar_numeros import AdicionarNumeros
from subtrair_numeros import SubtrairNumeros
from multiplicar_numeros import MultiplicarNumeros
from dividir_numeros import DividirNumeros
from interface_cadeia import Cadeia
from numeros import Numeros


if __name__ == '__main__':
cadeia_1: Cadeia = AdicionarNumeros()
cadeia_2: Cadeia = SubtrairNumeros()
cadeia_3: Cadeia = MultiplicarNumeros()
cadeia_4: Cadeia = DividirNumeros()

cadeia_1.definir_proximo_na_cadeia(proxima_cadeia=cadeia_2)
cadeia_2.definir_proximo_na_cadeia(proxima_cadeia=cadeia_3)
cadeia_3.definir_proximo_na_cadeia(proxima_cadeia=cadeia_4)

print("operação de soma")
requisicao: Numeros = Numeros(numero_1=20, numero_2=10, calculo_desejado="somar")
cadeia_1.calcular(requisicao=requisicao)

print("\noperação de subtração")
requisicao: Numeros = Numeros(numero_1=20, numero_2=10, calculo_desejado="subtrair")
cadeia_1.calcular(requisicao=requisicao)

print("\noperação de multiplicação")
requisicao: Numeros = Numeros(numero_1=20, numero_2=10, calculo_desejado="multiplicar")
cadeia_1.calcular(requisicao=requisicao)

print("\noperação de divisão")
requisicao: Numeros = Numeros(numero_1=20, numero_2=10, calculo_desejado="dividir")
cadeia_1.calcular(requisicao=requisicao)

print("\noperação que não existe na cadeia -> raiz quadrada")
requisicao: Numeros = Numeros(numero_1=20, numero_2=10, calculo_desejado="raiz quadrada")
cadeia_1.calcular(requisicao=requisicao)
17 changes: 17 additions & 0 deletions S08 - Padrões de projeto/chain_of_responsibility/somar_numeros.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from interface_cadeia import Cadeia
from numeros import Numeros


class AdicionarNumeros(Cadeia):
def __init__(self):
self._proximo_na_cadeia: Cadeia = None

def definir_proximo_na_cadeia(self, proxima_cadeia: Cadeia):
self._proximo_na_cadeia = proxima_cadeia

def calcular(self, requisicao: Numeros):
if requisicao.calculo_desejado == "somar":
print(f"{requisicao.numero_1} + {requisicao.numero_2} = {requisicao.numero_1 + requisicao.numero_2}")
else:
self._proximo_na_cadeia.calcular(requisicao=requisicao)

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from interface_cadeia import Cadeia
from numeros import Numeros


class SubtrairNumeros(Cadeia):
def __init__(self):
self._proximo_na_cadeia: Cadeia = None

def definir_proximo_na_cadeia(self, proxima_cadeia: Cadeia):
self._proximo_na_cadeia = proxima_cadeia

def calcular(self, requisicao: Numeros):
if requisicao.calculo_desejado == "subtrair":
print(f"{requisicao.numero_1} - {requisicao.numero_2} = {requisicao.numero_1 - requisicao.numero_2}")
else:
self._proximo_na_cadeia.calcular(requisicao=requisicao)

2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/command/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__pycache__
.vscode
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/command/.replit
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
language = "python3"
run = "python principal.py"
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/command/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# command

O código desse repositório foi feito em python e é baseado no [vídeo do Derek Banas sobre o padrão de projeto Command](https://www.youtube.com/watch?v=7Pj5kAhVBlg&feature=emb_logo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site [Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
Empty file.
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/command/botao_dispositivo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from comando import Comando


class BotaoDispositivo:
def __init__(self, comando: Comando):
self.comando = comando

def apertar(self):
self.comando.executar()
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/command/comando.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class Comando(ABC):
@abstractmethod
def executar(self):
pass
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/command/comando_aumentar_volume_tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from comando import Comando
from dispositivo_eletronico import DispositivoEletronico


class ComandoAumentarVolumeTV(Comando):
def __init__(self, dispositivo: DispositivoEletronico):
self.dispositivo = dispositivo

def executar(self):
self.dispositivo.aumentar_volume()

11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/command/comando_desligar_tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from comando import Comando
from dispositivo_eletronico import DispositivoEletronico


class ComandoDesligarTV(Comando):
def __init__(self, dispositivo: DispositivoEletronico):
self.dispositivo = dispositivo

def executar(self):
self.dispositivo.desligar()

11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/command/comando_diminuir_volume_tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from comando import Comando
from dispositivo_eletronico import DispositivoEletronico


class ComandoDiminuirVolumeTV(Comando):
def __init__(self, dispositivo: DispositivoEletronico):
self.dispositivo = dispositivo

def executar(self):
self.dispositivo.diminuir_volume()

11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/command/comando_ligar_tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from comando import Comando
from dispositivo_eletronico import DispositivoEletronico


class ComandoLigarTV(Comando):
def __init__(self, dispositivo: DispositivoEletronico):
self.dispositivo = dispositivo

def executar(self):
self.dispositivo.ligar()

8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/command/controle_tv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from televisao import Televisao
from dispositivo_eletronico import DispositivoEletronico


class ControleRemoto:
@classmethod
def pegar_dispositivo_eletronico(cls) -> DispositivoEletronico:
return Televisao()
21 changes: 21 additions & 0 deletions S08 - Padrões de projeto/command/dispositivo_eletronico.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from abc import ABC, abstractmethod


class DispositivoEletronico(ABC):
@abstractmethod
def ligar(self):
pass

@abstractmethod
def desligar(self):
pass

@abstractmethod
def aumentar_volume(self):
pass

@abstractmethod
def diminuir_volume(self):
pass


32 changes: 32 additions & 0 deletions S08 - Padrões de projeto/command/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from controle_tv import ControleRemoto
from comando_ligar_tv import ComandoLigarTV
from comando_desligar_tv import ComandoDesligarTV
from comando_aumentar_volume_tv import ComandoAumentarVolumeTV
from comando_diminuir_volume_tv import ComandoDiminuirVolumeTV
from botao_dispositivo import BotaoDispositivo


if __name__ == '__main__':
tv = ControleRemoto.pegar_dispositivo_eletronico()

ligar_tv = ComandoLigarTV(dispositivo=tv)
botao = BotaoDispositivo(comando=ligar_tv)
botao.apertar()

aumentar_volume = ComandoAumentarVolumeTV(dispositivo=tv)
botao = BotaoDispositivo(comando=aumentar_volume)
botao.apertar()
botao.apertar()
botao.apertar()
botao.apertar()
botao.apertar()

diminuir_volume = ComandoDiminuirVolumeTV(dispositivo=tv)
botao = BotaoDispositivo(comando=diminuir_volume)
botao.apertar()
botao.apertar()

desligar_tv = ComandoDesligarTV(dispositivo=tv)
botao = BotaoDispositivo(comando=desligar_tv)
botao.apertar()

20 changes: 20 additions & 0 deletions S08 - Padrões de projeto/command/televisao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from dispositivo_eletronico import DispositivoEletronico


class Televisao(DispositivoEletronico):
_volume = 0

def ligar(self):
print("Televisão ligada")

def desligar(self):
print("Televisão desligada")

def aumentar_volume(self):
self._volume += 1
print(f"O volume da televisão é {self._volume}")

def diminuir_volume(self):
self._volume -= 1
print(f"O volume da televisão é {self._volume}")

1 change: 1 addition & 0 deletions S08 - Padrões de projeto/composite/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/composite/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Composite

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Composite](https://www.youtube.com/watch?v=2HUnoKyC9l0)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
41 changes: 41 additions & 0 deletions S08 - Padrões de projeto/composite/cancao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from componente_cancao import ComponenteCancao


class Cancao(ComponenteCancao):
def adicionar(self, cancao) -> None:
super(Cancao, self).adicionar()

def remover(self, cancao) -> None:
super(Cancao, self).remover()

def obter_componente(self, indice: int) -> "ComponenteCancao":
super(Cancao, self).obter_componente()

def obter_nome_cancao(self) -> None:
super(Cancao, self).obter_nome_cancao()

def obter_nome_da_banda(self) -> None:
super(Cancao, self).obter_nome_da_banda()

def obter_ano_de_lancaomento(self) -> None:
super(Cancao, self).obter_ano_de_lancaomento()

def __init__(self, nome: str, nome_da_banda: str, ano_de_lancamento: int):
self._nome = nome
self._nome_da_banda = nome_da_banda
self._ano_de_lancamento = ano_de_lancamento

@property
def nome(self):
return self._nome

@property
def nome_da_banda(self):
return self._nome_da_banda

@property
def ano_de_lancamento(self):
return self._ano_de_lancamento

def mostrar_informacoes_da_cancao(self) -> None:
print(f"{self.nome} foi gravado por {self.nome_da_banda} no ano de {self.ano_de_lancamento}")
32 changes: 32 additions & 0 deletions S08 - Padrões de projeto/composite/componente_cancao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from abc import ABC, abstractmethod
from excecoes import *


class ComponenteCancao(ABC):
@abstractmethod
def adicionar(self, cancao) -> None:
raise OperacaoDeAdicaoInvalida("Operação não supoerta: Não é possível adicionar uma nova canção")

@abstractmethod
def remover(self, cancao) -> None:
raise OperacaoDeRemocaoInvalida("Operação não supoerta: Não é possível remove essa canção")

@abstractmethod
def obter_componente(self, indice: int) -> "ComponenteCancao":
raise OperacaoNaoSuportada("Operação não supoerta: Não é possível obter um componente")

@abstractmethod
def obter_nome_cancao(self) -> None:
raise OperacaoNaoSuportada("Operação não supoerta: Não é possível obter o nome dessa canção")

@abstractmethod
def obter_nome_da_banda(self) -> None:
raise OperacaoNaoSuportada("Operação não supoerta: Não é possível obter o nome da banda")

@abstractmethod
def obter_ano_de_lancaomento(self) -> None:
raise OperacaoNaoSuportada("Operação não supoerta: Não é possível obter o ano de lançamento")

@abstractmethod
def mostrar_informacoes_da_cancao(self) -> None:
raise OperacaoNaoSuportada("Operação não supoerta: Não é possível obter as informações da canção")
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/composite/excecoes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class OperacaoDeAdicaoInvalida(Exception):
pass


class OperacaoDeRemocaoInvalida(Exception):
pass


class OperacaoNaoSuportada(Exception):
pass
45 changes: 45 additions & 0 deletions S08 - Padrões de projeto/composite/grupo_cancao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from componente_cancao import ComponenteCancao
from typing import List
from collections.abc import Iterator


class GrupoCancao(ComponenteCancao):
def __init__(self, nome: str, descricao: str):
self._nome: str = nome
self._descricao: str = descricao
self.elementos: List["GrupoCancao", ComponenteCancao] = []

@property
def nome(self):
return self._nome

@property
def descricao(self):
return self._descricao

def adicionar(self, cancao: ComponenteCancao) -> None:
self.elementos.append(cancao)

def remover(self, cancao: ComponenteCancao) -> None:
self.elementos.remove(cancao)

def obter_componente(self, indice: int) -> ComponenteCancao:
return self.elementos.__getitem__(indice)

def obter_nome_cancao(self) -> None:
super(GrupoCancao, self).obter_nome_cancao()

def obter_nome_da_banda(self) -> None:
super(GrupoCancao, self).obter_nome_da_banda()

def obter_ano_de_lancaomento(self) -> None:
super(GrupoCancao, self).obter_ano_de_lancaomento()

def mostrar_informacoes_da_cancao(self) -> None:
print(f"\nnome do grupo: {self.nome}"
f"\ndescricao: {self.descricao}")

for elemento in self.elementos:
elemento.mostrar_informacoes_da_cancao()


30 changes: 30 additions & 0 deletions S08 - Padrões de projeto/composite/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from componente_cancao import ComponenteCancao
from grupo_cancao import GrupoCancao
from cancao import Cancao
from tocador_de_disco import TocadorDeDiscos


if __name__ == '__main__':
industrial: ComponenteCancao = GrupoCancao(nome="\nindustrial", descricao="vai 1")
heavy_metal: ComponenteCancao = GrupoCancao(nome="\nheavy metal", descricao="vai 2")
pisadinha: ComponenteCancao = GrupoCancao(nome="\npisadinha", descricao="vai 3")

tudo: ComponenteCancao = GrupoCancao(nome="grupo de músicas", descricao="todas as músicas disponíveis")
tudo.adicionar(industrial)
industrial.adicionar(Cancao(nome="Head Like a Hole", nome_da_banda="NIN", ano_de_lancamento=1990))
industrial.adicionar(Cancao(nome="Head Hunter", nome_da_banda="Front 242", ano_de_lancamento=1988))

industrial.adicionar(pisadinha)
pisadinha.adicionar(
Cancao(
nome="Basta Você Me Ligar (part. Xand Avião)",
nome_da_banda="Os Barões da Pisadinha",
ano_de_lancamento=2020
)
)

tudo.adicionar(heavy_metal)
heavy_metal.adicionar(Cancao(nome="To Tame a Land", nome_da_banda="Iron Maiden", ano_de_lancamento=1983))

tocador: TocadorDeDiscos = TocadorDeDiscos(lista_de_cancoes=tudo)
tocador.obter_lista_de_cancoes()
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/composite/tocador_de_disco.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from componente_cancao import ComponenteCancao


class TocadorDeDiscos:
def __init__(self, lista_de_cancoes: ComponenteCancao):
self._lista_de_cancoes: ComponenteCancao = lista_de_cancoes

def obter_lista_de_cancoes(self):
self._lista_de_cancoes.mostrar_informacoes_da_cancao()
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/decorator/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__pycache__
.vscode
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/decorator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# decorator

O código desse repositório foi feito em python e é baseado no [vídeo do Derek Banas sobre o padrão de projeto Decorator](https://www.youtube.com/watch?v=j40kRwSm4VE&feature=emb_logo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site [Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
Empty file.
13 changes: 13 additions & 0 deletions S08 - Padrões de projeto/decorator/cobertura_decorator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from abc import ABC
from pizza import Pizza


class CoberturaDecorator(Pizza, ABC):
def __init__(self, pizza: Pizza):
self._pizza = pizza

def pegar_descricao(self) -> str:
return self._pizza.pegar_descricao()

def pegar_valor(self) -> float:
return self._pizza.pegar_valor()
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/decorator/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from pizza import Pizza
from molho_de_tomate import MolhoDeTomate
from mussarela import Mussarela
from pizza_simples import PizzaSimples


if __name__ == '__main__':
minha_pizza: Pizza = MolhoDeTomate(Mussarela(PizzaSimples()))
print(f"ingredientes: {minha_pizza.pegar_descricao()}")
print(f"valor: {minha_pizza.pegar_valor()}")

14 changes: 14 additions & 0 deletions S08 - Padrões de projeto/decorator/molho_de_tomate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from cobertura_decorator import CoberturaDecorator


class MolhoDeTomate(CoberturaDecorator):
def __init__(self, pizza):
super().__init__(pizza)

print("Adicionando tomate")

def pegar_descricao(self) -> str:
return self._pizza.pegar_descricao() + ", molho de tomate"

def pegar_valor(self) -> float:
return self._pizza.pegar_valor() + 0.35
15 changes: 15 additions & 0 deletions S08 - Padrões de projeto/decorator/mussarela.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from cobertura_decorator import CoberturaDecorator


class Mussarela(CoberturaDecorator):
def __init__(self, pizza):
super().__init__(pizza)

print("Adicionando massa")
print("Adicionando mussarela")

def pegar_descricao(self) -> str:
return self._pizza.pegar_descricao() + ", mussarela"

def pegar_valor(self) -> float:
return self._pizza.pegar_valor() + 0.50
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/decorator/pizza.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from abc import abstractmethod, ABC


class Pizza(ABC):
@abstractmethod
def pegar_descricao(self) -> str:
pass

@abstractmethod
def pegar_valor(self) -> float:
return 4.0
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/decorator/pizza_simples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from pizza import Pizza


class PizzaSimples(Pizza):
def pegar_descricao(self) -> str:
return "massa fina"

def pegar_valor(self) -> float:
return 4.0
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/delegation/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/delegation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# delegation

O código desse repositório foi feito em python e é baseado no
vídeo do canal [Receitas de Código](https://www.youtube.com/channel/UC9XwbqDtIgEsAnYFDPZJuiA) que fala sobre o
padrão de projeto [Delegation](https://www.youtube.com/watch?v=KtZlDhC_ycs)
17 changes: 17 additions & 0 deletions S08 - Padrões de projeto/delegation/conta.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from conversor import Conversor


class Conta:
def __init__(self):
self.__valor_total = 100.0

@property
def saldo(self) -> float:
return self.__valor_total

@saldo.setter
def saldo(self, novo_valor: float):
self.__valor_total = novo_valor

def obter_saldo_convertido(self, conversao: Conversor) -> float:
return conversao.converter(valor=self.__valor_total)
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/delegation/conversor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class Conversor(ABC):
@abstractmethod
def converter(self, valor: float) -> float:
pass
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/delegation/conversor_para_dolar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from conversor import Conversor


class ConversorDolar(Conversor):
def converter(self, valor: float) -> float:
return valor * 5.5
14 changes: 14 additions & 0 deletions S08 - Padrões de projeto/delegation/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from conta import Conta
from conversor import Conversor
from conversor_para_dolar import ConversorDolar


if __name__ == '__main__':
conta: Conta = Conta()
conta.saldo = 10.0

conversor: Conversor = ConversorDolar()
print(f"saldo normal: {conta.saldo}")

valor_convertido = conversor.converter(valor=conta.saldo)
print(f"saldo em dolar: {valor_convertido}")
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/facade/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/facade/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# facade

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Facade](https://www.youtube.com/watch?v=B1Y8fcYrz5o)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
4 changes: 4 additions & 0 deletions S08 - Padrões de projeto/facade/banco_boas_vindas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class BancoBoasVindas:
def __init__(self):
print("Bem vindo ao banco ABC")
print("Estamos felizes em lhe dar eu dinheiro se pudermos encontrá-lo")
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/facade/codigo_seguranca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class CodigoSeguranca:
def __init__(self):
self.codigo = 1234

def validar_codigo_seguranca(self, codigo: int):
resultado = False
if codigo == self.codigo:
resultado = True

return resultado
38 changes: 38 additions & 0 deletions S08 - Padrões de projeto/facade/fachada.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from numero_conta import NumeroContaDoBanco
from codigo_seguranca import CodigoSeguranca
from fundos import Fundos
from banco_boas_vindas import BancoBoasVindas


class ContaBancoFachada:
def __init__(self, novo_numero_conta: int, novo_codigo_segunranca: int):
self.numero_da_conta = novo_numero_conta
self.codigo_seguranca = novo_codigo_segunranca

self.banco = BancoBoasVindas()
self.checagem_numero_conta = NumeroContaDoBanco()
self.checagem_codigo_seguranca = CodigoSeguranca()
self.checagem_fundos = Fundos()

def retirar_dinheiro(self, valor: float):
if (
self.checagem_numero_conta.validar_numero_conta(self.numero_da_conta)
and self.checagem_codigo_seguranca.validar_codigo_seguranca(
self.codigo_seguranca
)
and self.checagem_fundos.tem_dinheiro_suficiente(valor)
):
print("Transação completada!!!")
else:
print("Transação falhou!!!")

def depositar_dinheiro(self, valor: float):
if self.checagem_numero_conta.validar_numero_conta(
self.numero_da_conta
) and self.checagem_codigo_seguranca.validar_codigo_seguranca(
self.codigo_seguranca
):
self.checagem_fundos.fazer_deposito(valor)
print("Transação completada!!!")
else:
print("Transação falhou!!!")
25 changes: 25 additions & 0 deletions S08 - Padrões de projeto/facade/fundos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Fundos:
def __init__(self):
self.dinheiro_em_conta = 1000.0

def retirar_dinheiro_da_conta(self, valor: float):
self.dinheiro_em_conta -= valor

def depositar_dinheiro_na_conta(self, valor: float):
self.dinheiro_em_conta += valor

def tem_dinheiro_suficiente(self, valor_para_retirar: float) -> float:
if valor_para_retirar > self.dinheiro_em_conta:
print("Erro: Você não tem dinheiro o suficiente")
print(f"Valor atual em conta: {self.dinheiro_em_conta}")
return False
else:
self.retirar_dinheiro_da_conta(valor=valor_para_retirar)
print(
f"Retirada finalizada com sucesso. Novo saldo: {self.dinheiro_em_conta}"
)
return True

def fazer_deposito(self, valor_a_depositar: float):
self.depositar_dinheiro_na_conta(valor=valor_a_depositar)
print(f"Depósito concluído com sucesso. Novo saldo: {self.dinheiro_em_conta}")
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/facade/numero_conta.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class NumeroContaDoBanco:
def __init__(self):
self.numero_conta = 123456

def validar_numero_conta(self, numero: int):
resultado = False
if numero == self.numero_conta:
resultado = True

return resultado
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/facade/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from fachada import ContaBancoFachada

if __name__ == "__main__":
conta = ContaBancoFachada(novo_numero_conta=123456, novo_codigo_segunranca=1234)
conta.retirar_dinheiro(50.0)
conta.retirar_dinheiro(900.0)
conta.retirar_dinheiro(900.0)
conta.depositar_dinheiro(200)
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/factory/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
3 changes: 3 additions & 0 deletions S08 - Padrões de projeto/factory/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# factory

O código desse repositório foi feito em python e é baseado no [vídeo do Derek Banas sobre o padrão de projeto Factory Design](https://www.youtube.com/watch?v=ub0DXaeV6hA&feature=emb_logo)
20 changes: 20 additions & 0 deletions S08 - Padrões de projeto/factory/fabrica_de_navios.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from navio_inimigo import NavioInimigo
from navio_inimigo_ufo import NavioInimigoUFO
from navio_inimigo_foguete import NavioInimigoFoguete
from grande_navio_inimigo_ufo import GrandeNavioInimigoUFO


class FabricaDeNavios:
def __init__(self, tipo_navio_inimigo: str):
self.navio = None
if tipo_navio_inimigo == "U":
self.navio = NavioInimigoUFO()
elif tipo_navio_inimigo == "R":
self.navio = NavioInimigoFoguete()
elif tipo_navio_inimigo == "B":
self.navio = GrandeNavioInimigoUFO()

self.retornar_navio_fabricado

def retornar_navio_fabricado(self) -> NavioInimigo:
return self.navio
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/factory/grande_navio_inimigo_ufo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from navio_inimigo import NavioInimigo


class GrandeNavioInimigoUFO(NavioInimigo):
def __init__(self):
super().__init__("grande navio inimigo UFO", 40.0)
25 changes: 25 additions & 0 deletions S08 - Padrões de projeto/factory/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from navio_inimigo_foguete import NavioInimigoFoguete
from navio_inimigo_ufo import NavioInimigoUFO
from navio_inimigo import NavioInimigo

from fabrica_de_navios import FabricaDeNavios

from typing import Optional


def ataque_inimigo(navio: Optional[NavioInimigo]):
if navio:
navio.exibir_navio_inimigo_na_tela()
navio.seguir_navio_do_heroi()
navio.atirar()
else:
print("Digite U ou R ou B na próxima vez ;)")


if __name__ == "__main__":
tipo_navio_inimigo = input(
"Qual tipo de navio inimigo você quer criar? (digite U / R / B) -> "
).upper()
fabrica = FabricaDeNavios(tipo_navio_inimigo)

ataque_inimigo(fabrica.retornar_navio_fabricado())
31 changes: 31 additions & 0 deletions S08 - Padrões de projeto/factory/navio_inimigo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
class NavioInimigo:
def __init__(self, nome: str, quantidade_de_dano: float):
self.__nome: str = nome
self.__quantidade_de_dano: float = quantidade_de_dano

@property
def nome(self) -> str:
return self.__nome

@nome.setter
def nome(self, novo_nome: str) -> None:
self.__nome = novo_nome

@property
def quantidade_de_dano(self) -> float:
return self.__quantidade_de_dano

@quantidade_de_dano.setter
def quantidade_de_dano(self, nova_quantidade_de_dano: float) -> None:
self.__quantidade_de_dano = nova_quantidade_de_dano

def seguir_navio_do_heroi(self) -> None:
print(f"{self.__nome} está seguindo o herói")

def exibir_navio_inimigo_na_tela(self) -> None:
print(f"{self.__nome} está na tela")

def atirar(self) -> None:
print(
f"{self.__nome} está atacando e causando {self.__quantidade_de_dano} de dano"
)
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/factory/navio_inimigo_foguete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from navio_inimigo import NavioInimigo


class NavioInimigoFoguete(NavioInimigo):
def __init__(self):
super().__init__("navio inimigo foguete", 10.0)
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/factory/navio_inimigo_ufo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from navio_inimigo import NavioInimigo


class NavioInimigoUFO(NavioInimigo):
def __init__(self):
super().__init__("navio inimigo UFO", 20.0)
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/flyweight/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.vscode
__pycache__
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/flyweight/Readme.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Flyweight

Exemplo escrito em python e baseado no do [Refactoring.Guru](https://refactoring.guru/pt-br)
sobre o padrão de projeto [Flyweight](https://refactoring.guru/pt-br/design-patterns/flyweight).


Um ótimo vídeo com outras explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=0vV-R2926ss).
Nesse caso, o exemplo é feito em Java :coffee:
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/flyweight/fabrica.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from typing import List, Dict
from flyweight import Flyweight


class FabricaFlyweight:
_flyweights: Dict[str, Flyweight] = {}

def __init__(self, flyweights_iniciais: List) -> None:
for estado in flyweights_iniciais:
self._flyweights[self.obter_chave(estado)] = Flyweight(estado)

def obter_chave(self, estado: Dict) -> str:
return "_".join(sorted(estado))

def obter_flyweight(self, estado_compartilhado: Dict) -> Flyweight:
chave = self.obter_chave(estado_compartilhado)

if not self._flyweights.get(chave):
print("Fábrica: Não foi achado o flyweight. Criando um novo.")
self._flyweights[chave] = Flyweight(estado_compartilhado)
else:
print("Fábrica: Reutilizano um flyweight já existente.")

return self._flyweights[chave]

def listar_flyweights(self) -> None:
quantidade_de_objetos = len(self._flyweights)
print(f"Fábrica: Temos {quantidade_de_objetos} flyweights:")
print("\n".join(map(str, self._flyweights.keys())), end="")
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/flyweight/flyweight.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import json


class Flyweight:
def __init__(self, estado_compartilhado: str) -> None:
self._estado_compartilhado = estado_compartilhado

def operacao(self, estado_unico: str) -> None:
compartilhado = json.dumps(self._estado_compartilhado)
unico = json.dumps(estado_unico)
print(f"Flyweight: Exibindo compartilhado ({compartilhado}) e o estado ({unico}) único.", end="")
38 changes: 38 additions & 0 deletions S08 - Padrões de projeto/flyweight/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from typing import Dict
from fabrica import FabricaFlyweight


def adicionando_carro_ao_banco_de_dados_da_policia(
fabrica: FabricaFlyweight, placa: str, nome_do_dono: str,
marca: str, modelo: str, cor: str
) -> None:
print("\n\nCliente: Adicionando carro...")
flyweight = fabrica.obter_flyweight([marca, modelo, cor])
flyweight.operacao([placa, nome_do_dono])


if __name__ == "__main__":
"""
The client code usually creates a bunch of pre-populated flyweights in the
initialization stage of the application.
"""

fabrica = FabricaFlyweight([
["Chevrolet", "Camaro2018", "pink"],
["Mercedes Benz", "C300", "black"],
["Mercedes Benz", "C500", "red"],
["BMW", "M5", "red"],
["BMW", "X6", "white"],
])

fabrica.listar_flyweights()

adicionando_carro_ao_banco_de_dados_da_policia(
fabrica, "CL234IR", "James Doe", "BMW", "M5", "red")

adicionando_carro_ao_banco_de_dados_da_policia(
fabrica, "CL234IR", "James Doe", "BMW", "X1", "red")

print("\n")

fabrica.listar_flyweights()
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/grasp-creator/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/grasp-creator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# grasp creator
19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/grasp-creator/pedido.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from typing import List
from pedido_item import PedidoItem
from produto import Produto


class Pedido:
def __init__(self):
self.__items: List[PedidoItem] = []

def adicionar_item_na_compra(self, produto: Produto):
item: PedidoItem = PedidoItem(produto=produto)
self.__items.append(item)

def calcular_valor_total_da_venda(self) -> float:
valor_total: float = 0.0
for item in self.__items:
valor_total += item.calcular_valor_total_do_item()

return valor_total
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/grasp-creator/pedido_item.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from produto import Produto


class PedidoItem:
def __init__(self, produto: Produto):
self.__nome: str = produto.nome
self.__preco_unitario: float = produto.valor_unitario
self.__quantidade_unidades_compradas: int = 2

def calcular_valor_total_do_item(self) -> float:
return self.__quantidade_unidades_compradas * self.__preco_unitario
49 changes: 49 additions & 0 deletions S08 - Padrões de projeto/grasp-creator/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""
class Pedido {

private List itens;

public void criarNovoPedidoItem(Produto produto) {
//Criamos a instancia de pedido item
PedidoItem pedidoItem = new PedidoItem(produto);
this.itens.add(pedidoItem);
}
}

class Produto {

private String nome;
private String preco;

}

class PedidoItem {

private String nome;
private String precoUnitario;
private int quantidade;

public PedidoItem(Produto produto){
this.nome = produto.getNome();
this.precoUnitario = produto.getPreco();
this.quantidade = 1;
}

}
"""
from produto import Produto
from pedido import Pedido


if __name__ == '__main__':
pedido: Pedido = Pedido()

leite_condensado: Produto = Produto(nome="leite moça", valor_unitario=6.50)
nescau: Produto = Produto(nome="nescau 150ml", valor_unitario=1.50)

pedido.adicionar_item_na_compra(leite_condensado)
pedido.adicionar_item_na_compra(nescau)

valor_final = pedido.calcular_valor_total_da_venda()

print(f"o valor total da compra foi: {valor_final}")
12 changes: 12 additions & 0 deletions S08 - Padrões de projeto/grasp-creator/produto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Produto:
def __init__(self, nome: str, valor_unitario: float):
self.__nome: str = nome
self.__valor_unitario: float = valor_unitario

@property
def valor_unitario(self) -> float:
return self.__valor_unitario

@property
def nome(self) -> str:
return self.__nome
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# grasp information expert
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/grasp-information-expert/item_vendido.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from produto import Produto


class ItemVendido:
def __init__(self, produto: Produto, quantidade_unidades_compradas: int):
self.__produto: Produto = produto
self.__quantidade_unidades_compradas: int = quantidade_unidades_compradas

def calcular_valor_total_do_item(self) -> float:
return self.__quantidade_unidades_compradas * self.__produto.valor_unitario
16 changes: 16 additions & 0 deletions S08 - Padrões de projeto/grasp-information-expert/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from venda import Venda
from item_vendido import ItemVendido
from produto import Produto


if __name__ == '__main__':
leite_condensado: Produto = Produto(nome="leite moça", valor_unitario=6.50)
nescau: Produto = Produto(nome="nescau 150ml", valor_unitario=1.50)

venda: Venda = Venda()
venda.adicionar_item_na_compra(ItemVendido(produto=leite_condensado, quantidade_unidades_compradas=2))
venda.adicionar_item_na_compra(ItemVendido(produto=nescau, quantidade_unidades_compradas=10))

valor_final = venda.calcular_valor_total_da_venda()

print(f"o valor total da compra foi: {valor_final}")
12 changes: 12 additions & 0 deletions S08 - Padrões de projeto/grasp-information-expert/produto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Produto:
def __init__(self, nome: str, valor_unitario: float):
self.__nome: str = nome
self.__valor_unitario: float = valor_unitario

@property
def valor_unitario(self) -> float:
return self.__valor_unitario

@property
def nome(self) -> str:
return self.__nome
17 changes: 17 additions & 0 deletions S08 - Padrões de projeto/grasp-information-expert/venda.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from typing import List
from item_vendido import ItemVendido


class Venda:
def __init__(self):
self.__items: List[ItemVendido] = []

def adicionar_item_na_compra(self, item: ItemVendido):
self.__items.append(item)

def calcular_valor_total_da_venda(self) -> float:
valor_total: float = 0.0
for item in self.__items:
valor_total += item.calcular_valor_total_do_item()

return valor_total
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/interpreter/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/interpreter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Interpreter

Código baseado no do [Matheus Castiglioni](https://blog.matheuscastiglioni.com.br/interpreter-padroes-de-projeto-em-java/),
em que ele explica o funcionamento desse padrão.

Um ótimo vídeo com mais explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=6CVymSJQuJE).
Nesse caso o exemplo é em Java :coffee:
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/interpreter/divisao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from operador import Operador


class Dividir(Operador):
def __init__(self, esquerda: Operador, direita: Operador):
self._esquerda: Operador = esquerda
self._direita: Operador = direita

def interpretar(self) -> float:
return self._esquerda.interpretar() / self._direita.interpretar()
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/interpreter/multiplicacao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from operador import Operador


class Multiplicar(Operador):
def __init__(self, esquerda: Operador, direita: Operador):
self._esquerda: Operador = esquerda
self._direita: Operador = direita

def interpretar(self) -> int:
return self._esquerda.interpretar() * self._direita.interpretar()
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/interpreter/numero.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from operador import Operador


class Numero(Operador):
def __init__(self, valor: int):
self._valor: int = valor

def interpretar(self) -> int:
return self._valor
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/interpreter/operador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class Operador(ABC):
@abstractmethod
def interpretar(self) -> int:
pass
24 changes: 24 additions & 0 deletions S08 - Padrões de projeto/interpreter/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from operador import Operador
from numero import Numero
from soma import Somar
from subtracao import Subtrair
from multiplicacao import Multiplicar
from divisao import Dividir


if __name__ == '__main__':
somar: Operador = Somar(Numero(1), Numero(4))
# 1 + 4 = 5
print(f"resultado da soma: {somar.interpretar()}")

# 5 - 2 = 3
subtrair: Operador = Subtrair(somar, Numero(2))
print(f"resultado da subtração: {subtrair.interpretar()}")

# 5 * 3 = 15
multiplicar: Operador = Multiplicar(subtrair, somar)
print(f"resultado da multiplicação: {multiplicar.interpretar()}")

# 30 / 15 = 2
dividir: Operador = Dividir(Numero(30), multiplicar)
print(f"resultado da divisão: {dividir.interpretar()}")
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/interpreter/soma.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from operador import Operador


class Somar(Operador):
def __init__(self, esquerda: Operador, direita: Operador):
self._esquerda: Operador = esquerda
self._direita: Operador = direita

def interpretar(self) -> int:
return self._esquerda.interpretar() + self._direita.interpretar()
10 changes: 10 additions & 0 deletions S08 - Padrões de projeto/interpreter/subtracao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from operador import Operador


class Subtrair(Operador):
def __init__(self, esquerda: Operador, direita: Operador):
self._esquerda: Operador = esquerda
self._direita: Operador = direita

def interpretar(self) -> int:
return self._esquerda.interpretar() - self._direita.interpretar()
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/iterator/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/iterator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Iterator

Exemplo escrito em python e baseado no do [
Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto
[Iterator](https://refactoring.guru/pt-br/design-patterns/iterator).

Um ótimo vídeo com mais explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=VKIzUuMdmag&feature=emb_logo).
Nesse caso o exemplo é em Java :coffee:
20 changes: 20 additions & 0 deletions S08 - Padrões de projeto/iterator/cardapio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from collections.abc import Iterable
from iterador import IteradorDoCardapio


class Cardapio(Iterable):

def __init__(self, cardapio_inicial=None) -> None:
if cardapio_inicial is None:
cardapio_inicial = []

self._items_do_cardapio = cardapio_inicial

def __iter__(self) -> IteradorDoCardapio:
return IteradorDoCardapio(self._items_do_cardapio)

def get_reverse_iterator(self) -> IteradorDoCardapio:
return IteradorDoCardapio(items_do_cardapio=self._items_do_cardapio, percorrer_reversamente=True)

def adicionar_novo_item(self, item: str):
self._items_do_cardapio.append(item)
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/iterator/iterador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from collections.abc import Iterator
from typing import List


class IteradorDoCardapio(Iterator):

_posicao: int = None
_percorrer_reversamente: bool = False

def __init__(self, items_do_cardapio: List[str], percorrer_reversamente: bool = False) -> None:
self._items_do_cardapio = items_do_cardapio
self._percorrer_reversamente = percorrer_reversamente
self._posicao = 0
if percorrer_reversamente:
self._posicao = -1

def __next__(self):
try:
valor = self._items_do_cardapio[self._posicao]

indice_a_ser_somado = 1
if self._percorrer_reversamente:
indice_a_ser_somado = -1

self._posicao += indice_a_ser_somado
except IndexError:
raise StopIteration()

return valor
16 changes: 16 additions & 0 deletions S08 - Padrões de projeto/iterator/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from cardapio import Cardapio


if __name__ == "__main__":

cardapio = Cardapio()
cardapio.adicionar_novo_item("Tilápia")
cardapio.adicionar_novo_item("Carne do Sol")
cardapio.adicionar_novo_item("Macaxeira")

print("Percorrendo na ordem normal:")
print("\n".join(cardapio))
print("")

print("Percorrendo inversamente:")
print("\n".join(cardapio.get_reverse_iterator()), end="")
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/mediator/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/mediator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Mediator

Exemplo escrito em python e baseado no do [Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto
[Mediator](https://refactoring.guru/pt-br/design-patterns/mediator).

Um ótimo vídeo com mais explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=8DxIpdKd41A).
Nesse caso o exemplo é em Java :coffee:
71 changes: 71 additions & 0 deletions S08 - Padrões de projeto/mediator/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from __future__ import annotations
from abc import ABC


class Mediador(ABC):
def notificar(self, remetente: object, evento: str) -> None:
pass


class MediadorConcreto(Mediador):
def __init__(self, componente_1: Componente1, componente_2: Componente2) -> None:
self._componente_1 = componente_1
self._componente_1.mediador = self
self._componente_2 = componente_2
self._componente_2.mediador = self

def notificar(self, remetente: object, evento: str) -> None:
if evento == "A":
print("O mediador reage com A e dispara as seguintes operações:")
self._componente_2.para_c()
elif evento == "D":
print("O mediador reage com D e dispara as seguintes operações:")
self._componente_1.para_b()
self._componente_2.para_c()


class ComponenteBase:
def __init__(self, mediador: Mediador = None) -> None:
self._mediador = mediador

@property
def mediador(self) -> Mediador:
return self._mediador

@mediador.setter
def mediador(self, mediator: Mediador) -> None:
self._mediador = mediator


class Componente1(ComponenteBase):
def para_a(self) -> None:
print("Componente 1 dispara A")
self.mediador.notificar(self, "A")

def para_b(self) -> None:
print("Componente 1 dispara B")
self.mediador.notificar(self, "B")


class Componente2(ComponenteBase):
def para_c(self) -> None:
print("Componente 2 dispara C")
self.mediador.notificar(self, "C")

def para_d(self) -> None:
print("Componente 2 dispara D")
self.mediador.notificar(self, "D")


if __name__ == "__main__":
componente_1 = Componente1()
componente_2 = Componente2()
mediator = MediadorConcreto(componente_1, componente_2)

print("Cliente dispara a operação A.")
componente_1.para_a()

print("\n", end="")

print("Cliente dispara a operação D.")
componente_2.para_d()
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/memento/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/memento/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# memento

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Memento](https://www.youtube.com/watch?v=jOnxYT8Iaoo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/memento/momento.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Momento:
def __init__(self, artigo_para_salvar: str):
self.__artigo: str = artigo_para_salvar

def obter_artigo_salvo(self) -> str:
return self.__artigo
23 changes: 23 additions & 0 deletions S08 - Padrões de projeto/memento/originador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from momento import Momento


class Originador:
def __init__(self):
self.__artigo = ""

def modificar_artigo(self, novo_artigo: str):
print(f"Do originador: versão atual do artigo\n{self.__artigo}")
self.__artigo = novo_artigo

def salvar_momento(self) -> Momento:
print(f"Do originador: salvando estado atual no momento")
return Momento(artigo_para_salvar=self.__artigo)

@staticmethod
def restaurar_versao_do_momento(momento: Momento) -> str:
artigo = momento.obter_artigo_salvo()
print(f"Do originador: versão anteriormente salva no momento: {artigo}")

return artigo

pass
33 changes: 33 additions & 0 deletions S08 - Padrões de projeto/memento/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from originador import Originador
from zelador import Zelador


if __name__ == '__main__':
zelador: Zelador = Zelador()
origem: Originador = Originador()
quantidade_de_arquivos_salvos: int = 0

for _ in range(3):
artigo: str = input("Digite algo no artigo e aperte ENTER: ")
origem.modificar_artigo(artigo)
zelador.adicionar_versao(origem.salvar_momento())
quantidade_de_arquivos_salvos += 1
print(f"versão salva: {quantidade_de_arquivos_salvos}\n")

print("\n========================================================")
artigo_restaurado: str = origem.restaurar_versao_do_momento(
zelador.obter_versao(indice=2)
)
print(f"versão recuperada número 3: {artigo_restaurado}")

print("\n========================================================")
artigo_restaurado: str = origem.restaurar_versao_do_momento(
zelador.obter_versao(indice=1)
)
print(f"versão recuperada número 2: {artigo_restaurado}")

print("\n========================================================")
artigo_restaurado: str = origem.restaurar_versao_do_momento(
zelador.obter_versao(indice=0)
)
print(f"versão recuperada número 1: {artigo_restaurado}")
15 changes: 15 additions & 0 deletions S08 - Padrões de projeto/memento/zelador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from typing import List
from momento import Momento


class Zelador:
def __init__(self):
self.__artigos_salvos: List[Momento] = []

def adicionar_versao(self, versao: Momento) -> None:
self.__artigos_salvos.append(versao)

def obter_versao(self, indice: int) -> Momento:
return self.__artigos_salvos.__getitem__(indice)

pass
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/object_pool/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
4 changes: 4 additions & 0 deletions S08 - Padrões de projeto/object_pool/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# object pool

O código desse repositório foi feito em python e é baseado
[no exemplo do site source making sobre o padrão de projeto Object Pool](https://sourcemaking.com/design_patterns/object_pool)
20 changes: 20 additions & 0 deletions S08 - Padrões de projeto/object_pool/gerenciador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from reutilizavel import Reutilizavel


class Gerenciador:
"""
Gerenciar objetos Reutilizáveis para uso por objetos Cliente.
"""

def __init__(self, size):
print(f"Instanciando gerenciador com {size} objetos que os clientes podem reutilizar")
self.__objetos_reutilizaveis = [Reutilizavel() for _ in range(size)]

def adquirir(self):
print("Adquirindo um obejto reutilizável")
return self.__objetos_reutilizaveis.pop()

def adicionar(self, objeto_para_reutilizar: Reutilizavel):
print("Adicionando um objeto reutilizável ao gerenciador")
self.__objetos_reutilizaveis.append(objeto_para_reutilizar)

16 changes: 16 additions & 0 deletions S08 - Padrões de projeto/object_pool/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from gerenciador import Gerenciador
from reutilizavel import Reutilizavel
from time import sleep


if __name__ == "__main__":
gerenciador: Gerenciador = Gerenciador(10)
sleep(5)

print("Cliente requisitando um objeto disponível no gerenciador...")
objeto_reusavel: Reutilizavel = gerenciador.adquirir()
print("Cliente está usando o objeto reutilizável...")
sleep(5)

print("Terminou de usar. Devolvendo ao gerenciador...")
gerenciador.adicionar(objeto_reusavel)
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/object_pool/reutilizavel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Reutilizavel:
pass
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/observer/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
3 changes: 3 additions & 0 deletions S08 - Padrões de projeto/observer/Readme.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Padrão de projeto Observer

Esse código em python foi baseado no [vídeo do Derek Banas sobre o padrão de projeto Observer](https://www.youtube.com/watch?v=wiQdrH2YpT4&feature=emb_logo)
35 changes: 35 additions & 0 deletions S08 - Padrões de projeto/observer/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from stock_grabber import AdministradorAcoes
from stock_observer import ObservadorAcoes
from time import sleep


if __name__ == "__main__":
administrador = AdministradorAcoes()
observador_1 = ObservadorAcoes(identificador=1, assunto=administrador)

print("\nprimeira atualização...")
administrador.preco_ibm = 200.0
sleep(1)

print("\nsegunda atualização...")
administrador.preco_apple = 300.0
sleep(1)

print("\nterceira atualização...")
administrador.preco_google = 400.0
sleep(1)

print()
observador_2 = ObservadorAcoes(identificador=2, assunto=administrador)

print("\nquarta atualização...")
administrador.preco_ibm = 20000.0
sleep(1)

print("\nquinta atualização...")
administrador.preco_apple = 30000.0
sleep(1)

print("\nsexta atualização...")
administrador.preco_google = 40000.0
sleep(1)
9 changes: 9 additions & 0 deletions S08 - Padrões de projeto/observer/observer_interface.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import abc


class Observador(metaclass=abc.ABCMeta):
@abc.abstractmethod
def atualizar(
self, preco_ibm: float, preco_apple: float, preco_google: float
) -> None:
pass
55 changes: 55 additions & 0 deletions S08 - Padrões de projeto/observer/stock_grabber.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from subject_interface import Assunto
from observer_interface import Observador
from typing import List


class AdministradorAcoes(Assunto):
def __init__(self):
self.__observadores: List[Observador] = []
self.__preco_ibm: float = 0.0
self.__preco_apple: float = 0.0
self.__preco_google: float = 0.0

def registrar_novo_observador(self, novo_observador: Observador) -> None:
self.__observadores.append(novo_observador)
print("observador adicionado")

def cancelar_registro_de_um_observador(self, observador: Observador) -> None:
self.__observadores.remove(observador)
print("observador removido")

def notificar_observadores(self) -> None:
print("atualizando os valores dos observadores")
for observador in self.__observadores:
observador.atualizar(
preco_ibm=self.__preco_ibm,
preco_apple=self.__preco_apple,
preco_google=self.__preco_google,
)

@property
def preco_ibm(self) -> float:
return self.__preco_ibm

@property
def preco_apple(self) -> float:
return self.__preco_apple

@property
def preco_google(self) -> float:
return self.__preco_google

@preco_ibm.setter
def preco_ibm(self, novo_valor: float) -> None:
self.__preco_ibm = novo_valor
self.notificar_observadores()

@preco_apple.setter
def preco_apple(self, novo_valor: float) -> None:
self.__preco_apple = novo_valor
self.notificar_observadores()

@preco_google.setter
def preco_google(self, novo_valor: float) -> None:
self.__preco_google = novo_valor
self.notificar_observadores()
41 changes: 41 additions & 0 deletions S08 - Padrões de projeto/observer/stock_observer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from observer_interface import Observador
from subject_interface import Assunto


class ObservadorAcoes(Observador):
def __init__(self, identificador: int, assunto: Assunto):
self.__preco_ibm: float = 100.0
self.__preco_apple: float = 100.0
self.__preco_google: float = 100.0
self.__identificador: int = identificador
self.__assunto: Assunto = assunto

print(f"Novo observador id -> {self.__identificador}")
self.__assunto.registrar_novo_observador(novo_observador=self)

def atualizar(
self, preco_ibm: float, preco_apple: float, preco_google: float
) -> None:
self.__preco_ibm: float = preco_ibm
self.__preco_apple: float = preco_apple
self.__preco_google: float = preco_google

print(f"id do observador: {self.__identificador}")
self.printar_valores_atuais()

@property
def preco_ibm(self) -> float:
return self.__preco_ibm

@property
def preco_apple(self) -> float:
return self.__preco_apple

@property
def preco_google(self) -> float:
return self.__preco_google

def printar_valores_atuais(self) -> None:
print(f"ibm: {self.__preco_ibm}")
print(f"apple: {self.__preco_apple}")
print(f"google: {self.__preco_google}")
16 changes: 16 additions & 0 deletions S08 - Padrões de projeto/observer/subject_interface.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import abc
from observer_interface import Observador


class Assunto(metaclass=abc.ABCMeta):
@abc.abstractmethod
def registrar_novo_observador(self, novo_observador: Observador) -> None:
pass

@abc.abstractmethod
def cancelar_registro_de_um_observador(self, observador: Observador) -> None:
pass

@abc.abstractmethod
def notificar_observadores(self) -> None:
pass
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/private_class_data/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/private_class_data/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# private class data

O código desse repositório foi feito em python e é baseado no
vídeo do canal [Desenvolvimento de Jogos](https://www.youtube.com/watch?v=DLV2pb4kJ5E) que fala sobre o
padrão de projeto [Private Class Data](https://www.youtube.com/watch?v=DLV2pb4kJ5E)
14 changes: 14 additions & 0 deletions S08 - Padrões de projeto/private_class_data/particula.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from velocidade import Velocidade
from math import pow


class Particula:
def __init__(self, valor_velocidade: float, massa: float):
self.__velocidade: Velocidade = Velocidade(valor_velocidade)
self.__massa: float = massa

def calcular_energia_cinetica(self):
resultado = self.__massa * pow(self.__velocidade.obter_valor(), 2)
resultado = resultado / 2

return resultado
11 changes: 11 additions & 0 deletions S08 - Padrões de projeto/private_class_data/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from particula import Particula


if __name__ == '__main__':
particula_1 = Particula(valor_velocidade=10.0, massa=2.0)
resultado_energia_cinetica = particula_1.calcular_energia_cinetica()
print(f"valor da energia cinética: {resultado_energia_cinetica}\n")

particula_2 = Particula(valor_velocidade=5.0, massa=10.0)
resultado_energia_cinetica = particula_2.calcular_energia_cinetica()
print(f"valor da energia cinética: {resultado_energia_cinetica}\n")
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/private_class_data/velocidade.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Velocidade:
def __init__(self, valor: float):
self.__valor = valor

def obter_valor(self) -> float:
return self.__valor
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/prototype/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
5 changes: 5 additions & 0 deletions S08 - Padrões de projeto/prototype/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# prototype

O código desse repositório foi feito em python e é baseado no [vídeo do Derek Banas sobre o padrão de projeto Prototype](https://www.youtube.com/watch?v=AFbZhRL0Uz8&feature=emb_logo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site [Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/prototype/animal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class Animal(ABC):
@abstractmethod
def clonar(self):
pass
6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/prototype/clonador_de_animais.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from animal import Animal


class ClonadorDeAnimais:
def clonar_animal(self, animal_a_ser_clonado: Animal):
return animal_a_ser_clonado.clonar()
38 changes: 38 additions & 0 deletions S08 - Padrões de projeto/prototype/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from ovelha import Ovelha
from clonador_de_animais import ClonadorDeAnimais

if __name__ == "__main__":
clonador = ClonadorDeAnimais()
ovelha_dolly = Ovelha()
ovelha_fofolete = clonador.clonar_animal(ovelha_dolly)

print("\novelha dolly:")
print(ovelha_dolly)
print(f"id: {id(ovelha_dolly)}\n")

print("ovelha_fofolete:")
print(ovelha_fofolete)
print(f"id: {id(ovelha_fofolete)}\n")
msg = (
"Objetos iguais"
if id(ovelha_dolly) == id(ovelha_fofolete)
else "Objetos diferentes"
)
print(msg)

ovelha_dolly.tamanho = 20.0

print("\novelha dolly:")
print(ovelha_dolly)
print(f"id: {id(ovelha_dolly)}\n")

print(id(ovelha_fofolete))
print(ovelha_fofolete)
print(f"id: {id(ovelha_fofolete)}\n")

msg = (
"A mudança no tamanho não afetou os dois. Ou seja, deu certo"
if ovelha_dolly.tamanho != ovelha_fofolete.tamanho
else "Deu ruim"
)
print(msg)
23 changes: 23 additions & 0 deletions S08 - Padrões de projeto/prototype/ovelha.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from animal import Animal
from copy import copy, deepcopy


class Ovelha(Animal):
def __init__(self):
self._tamanho = 10.0
print("ovelha criada bééééééé")

def __str__(self):
return f"tamanho: {self._tamanho}"

@property
def tamanho(self) -> str:
return str(self._tamanho)

@tamanho.setter
def tamanho(self, novo_tamanho: float):
self._tamanho = novo_tamanho

def clonar(self):
print("clonei a ovelha")
return copy(self)
2 changes: 2 additions & 0 deletions S08 - Padrões de projeto/proxy/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.vscode
__pycache__
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/proxy/Readme.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Proxy

Exemplo escrito em python e baseado no do [Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto
[Proxy](https://refactoring.guru/pt-br/design-patterns/proxy).

Um ótimo vídeo com mais explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=cHg5bWW4nUI).
Nesse caso o exemplo é em Java :coffee:
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/proxy/interface_sujeito.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC, abstractmethod


class InterfaceSujeito(ABC):
@abstractmethod
def requisicao(self) -> None:
pass
19 changes: 19 additions & 0 deletions S08 - Padrões de projeto/proxy/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from interface_sujeito import InterfaceSujeito
from sujeito import Sujeito
from proxy import Proxy


def executar_cliente(sujeito: InterfaceSujeito) -> None:
sujeito.requisicao()


if __name__ == "__main__":
print("Cliente: Executando cliente com o sujeito concreto:")
sujeito_real = Sujeito()
executar_cliente(sujeito_real)

print()

print("Cliente: Executando o mesmo cliente utilizando o proxy:")
proxy = Proxy(sujeito_real)
executar_cliente(proxy)
20 changes: 20 additions & 0 deletions S08 - Padrões de projeto/proxy/proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from interface_sujeito import InterfaceSujeito
from sujeito import Sujeito


class Proxy(InterfaceSujeito):
def __init__(self, sujeito_real: Sujeito) -> None:
self._sujeito = sujeito_real

def requisicao(self) -> None:
if self.verificar_acesso():
self._sujeito.requisicao()
self.registro_de_acesso()

def verificar_acesso(self) -> bool:
print("Proxy: Verificar acesso antes de fazer requisição.")
return True

def registro_de_acesso(self) -> None:
print("Proxy: Registrando a hora da solicitação.", end="")

6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/proxy/sujeito.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from interface_sujeito import InterfaceSujeito


class Sujeito(InterfaceSujeito):
def requisicao(self) -> None:
print("Tratamento de requisição.")
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/singleton/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
4 changes: 4 additions & 0 deletions S08 - Padrões de projeto/singleton/Readme.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# singleton

Exemplo escrito em python e baseado no do [
Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto [Singleton](https://refactoring.guru/pt-br/design-patterns/singleton).
24 changes: 24 additions & 0 deletions S08 - Padrões de projeto/singleton/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from singleton import ConexaoBancoDeDados
from threading import Thread


def criando_conexao_banco(valor: str) -> None:
banco = ConexaoBancoDeDados(valor)
print(banco.nome_da_conexao)


if __name__ == "__main__":
# Código do cliente

print(
"Teste com threads para ver se é criada apenas uma conexão.\n\n"
"Se você ver o mesmo valor, então a conexão com o banco está sendo reusada (ieeeeei \o/)\n"
"Se os valores forem diferentes, "
"então duas conexões distintas foram criadas. Ou seja, deu ruim, pessoal!! :(\n\n"
"Resultado:\n"
)

conexao_1 = Thread(target=criando_conexao_banco, args=("Mongo",))
conexao_2 = Thread(target=criando_conexao_banco, args=("Postgres",))
conexao_1.start()
conexao_2.start()
25 changes: 25 additions & 0 deletions S08 - Padrões de projeto/singleton/singleton.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from threading import Lock


class SingletonMeta(type):
_instancias = {}

_lock: Lock = Lock()

def __call__(cls, *args, **kwargs):
with cls._lock:
if cls not in cls._instancias:
instancia = super().__call__(*args, **kwargs)
cls._instancias[cls] = instancia

return cls._instancias[cls]


class ConexaoBancoDeDados(metaclass=SingletonMeta):
nome_da_conexao: str = None

def __init__(self, nome_da_conexao: str) -> None:
self.nome_da_conexao = nome_da_conexao

def alguma_logica_de_negocio(self):
pass
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/state/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/state/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# State

Exemplo escrito em python e baseado no do [Refactoring.Guru](https://refactoring.guru/pt-br) sobre o padrão de projeto
[State](https://refactoring.guru/pt-br/design-patterns/state).

Um ótimo vídeo com mais explicações sobre esse padrão de projeto é o do
[Derek Banas](https://www.youtube.com/watch?v=MGEx35FjBuo).
Nesse caso o exemplo é em Java :coffee:
67 changes: 67 additions & 0 deletions S08 - Padrões de projeto/state/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from __future__ import annotations
from abc import ABC, abstractmethod


class Contexto:
_estado_atual = None

def __init__(self, estado: Estado) -> None:
self.transitar_para(estado)

def transitar_para(self, state: Estado):
print(f"Contexto: Transitando para o estado {type(state).__name__}")
self._estado_atual = state
self._estado_atual.contexto = self

def requisicao_1(self):
self._estado_atual.lidar_com_requisicao_1()

def requisicao_2(self):
self._estado_atual.lidar_com_requisicao_2()


class Estado(ABC):
def __init__(self, contexto = None):
self._contexto = contexto

@property
def contexto(self) -> Contexto:
return self._contexto

@contexto.setter
def contexto(self, contexto: Contexto) -> None:
self._contexto = contexto

@abstractmethod
def lidar_com_requisicao_1(self) -> None:
pass

@abstractmethod
def lidar_com_requisicao_2(self) -> None:
pass


class EstadoA(Estado):
def lidar_com_requisicao_1(self) -> None:
print("Estado A resolvendo a requisição 1.")
print("O estado A deseja alterar o estado do contexto.")
self.contexto.transitar_para(EstadoB())

def lidar_com_requisicao_2(self) -> None:
print("Estado A resolvendo a requisição 2.")


class EstadoB(Estado):
def lidar_com_requisicao_1(self) -> None:
print("Estado B resolvendo a requisição 1.")

def lidar_com_requisicao_2(self) -> None:
print("Estado B resolvendo a requisição 2.")
print("O estado B deseja alterar o estado do contexto.")
self.contexto.transitar_para(EstadoA())


if __name__ == "__main__":
contexto = Contexto(EstadoA())
contexto.requisicao_1()
contexto.requisicao_2()
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/strategy/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
3 changes: 3 additions & 0 deletions S08 - Padrões de projeto/strategy/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Strategy

Esse código é baseado em um exemplo demonstrado no canal do youtube [Código Fonte TV](https://www.youtube.com/watch?v=WPdrnuSHAQs)
8 changes: 8 additions & 0 deletions S08 - Padrões de projeto/strategy/frete_servico.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import abc


class FreteServico(metaclass=abc.ABCMeta):

@abc.abstractmethod
def calcula(self, peso: float) -> float:
pass
28 changes: 28 additions & 0 deletions S08 - Padrões de projeto/strategy/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from sedex import Sedex
from tnt import Tnt
from frete_servico import FreteServico

class Frete:
def __init__(self, empresa_que_fara_o_frete: FreteServico):
self._empresa = empresa_que_fara_o_frete

@property
def empresa(self):
return self._empresa

@empresa.setter
def empresa(self, empresa: FreteServico):
self._empresa = empresa

def calcular_valor(self, peso: float) -> float:
return self._empresa.calcula(peso)


if __name__ == "__main__":
frete = Frete(empresa_que_fara_o_frete=Sedex())
resultado = frete.calcular_valor(10)
print(resultado)

frete.empresa = Tnt()
resultado = frete.calcular_valor(10)
print(resultado)
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/strategy/sedex.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from frete_servico import FreteServico


class Sedex(FreteServico):
def calcula(self, peso: float) -> float:
return peso * 10.0 + 10.0

6 changes: 6 additions & 0 deletions S08 - Padrões de projeto/strategy/tnt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from frete_servico import FreteServico


class Tnt(FreteServico):
def calcula(self, peso: float) -> float:
return peso * 5.0 + 10.0
1 change: 1 addition & 0 deletions S08 - Padrões de projeto/template_method/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
7 changes: 7 additions & 0 deletions S08 - Padrões de projeto/template_method/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# template method

O código desse repositório foi feito em python e é baseado no
[vídeo do Derek Banas sobre o padrão de projeto Template Method](https://www.youtube.com/watch?v=aR1B8MlwbRI&feature=emb_logo)

Para mais informações/explicações sobre esse e outros padrões de projeto, recomendo a leitura do site
[Refactoring.Guru](https://refactoring.guru/pt-br/design-patterns) sobre o assunto.
58 changes: 58 additions & 0 deletions S08 - Padrões de projeto/template_method/hoagie.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from abc import ABC, abstractmethod


class Hoagie(ABC):
def fazer_sanduba(self):
self.cortar_pao()

if self.cliente_quer_carne():
self.adicionar_carne()

if self.cliente_quer_queijo():
self.adicionar_queijo()

if self.cliente_quer_verduras():
self.adicionar_verduras()

if self.cliente_quer_condimentos():
self.adicionar_condimentos()

self.embalar_sanduba()

def cortar_pao(self):
print(f"O sanduba foi cortado!")

@abstractmethod
def adicionar_carne(self):
pass

@abstractmethod
def adicionar_queijo(self):
pass

@abstractmethod
def adicionar_verduras(self):
pass

@abstractmethod
def adicionar_condimentos(self):
pass

@staticmethod
def cliente_quer_carne():
return True

@staticmethod
def cliente_quer_queijo():
return True

@staticmethod
def cliente_quer_verduras():
return True

@staticmethod
def cliente_quer_condimentos():
return True

def embalar_sanduba(self):
print("\nEmbalando o sanduba!")
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/template_method/hoagie_italiano.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from hoagie import Hoagie


class HoagieItaliano(Hoagie):
def __init__(self):
self.carnes_usadas = ["peperoni", "salame", "presunto de capicola"]
self.queijos_usados = ["provolone"]
self.vegetais_usados = ["alface", "tomate", "cebolas", "pimenta doce"]
self.condimentos_usados = ["óleo", "vinagre"]

def adicionar_carne(self):
print("adicionando a carne: ", end="")
for carne in self.carnes_usadas:
print(f"{carne}", end=" ")

def adicionar_queijo(self):
print("\nadicionando o queijo: ", end="")
for queijo in self.queijos_usados:
print(f"{queijo}", end=" ")

def adicionar_verduras(self):
print("\nadicionando verdura: ", end="")
for vegetal in self.vegetais_usados:
print(f"{vegetal}", end=" ")

def adicionar_condimentos(self):
print("\nadicionando condimento: ", end="")
for condimento in self.condimentos_usados:
print(f"{condimento}", end=" ")
29 changes: 29 additions & 0 deletions S08 - Padrões de projeto/template_method/hoagie_vegano.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from hoagie import Hoagie


class HoagieVegano(Hoagie):
def __init__(self):
self.vegetais_usados = ["alface", "tomate", "cebolas", "pimenta doce"]
self.condimentos_usados = ["óleo", "vinagre"]

def adicionar_verduras(self):
print("adicionando verdura: ", end="")
for vegetal in self.vegetais_usados:
print(f"{vegetal}", end=" ")

def adicionar_condimentos(self):
print("\nadicionando condimento: ", end="")
for condimento in self.condimentos_usados:
print(f"{condimento}", end=" ")

def adicionar_carne(self):
pass

def adicionar_queijo(self):
pass

def cliente_quer_carne(self):
return False

def cliente_quer_queijo(self):
return False
12 changes: 12 additions & 0 deletions S08 - Padrões de projeto/template_method/principal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from hoagie_italiano import HoagieItaliano
from hoagie_vegano import HoagieVegano


if __name__ == "__main__":
print("sanduba italiano")
sanduba_italiano = HoagieItaliano()
sanduba_italiano.fazer_sanduba()

print("\n\nsanduba vegano")
sanduba_vegano = HoagieVegano()
sanduba_vegano.fazer_sanduba()