Skip to content

Commit

Permalink
Inclusão dos códigos da cadeira de padrões de projeto 2020.2
Browse files Browse the repository at this point in the history
  • Loading branch information
Italo-Silva committed Oct 31, 2021
1 parent aa35259 commit 6a02d85
Show file tree
Hide file tree
Showing 180 changed files with 2,607 additions and 0 deletions.
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.
Loading

0 comments on commit 6a02d85

Please sign in to comment.