Cet article est un mémo d'étude personnel. J'écris un article motivé par l'obsession que ce que j'entre doit être une sortie. J'écris cet article sur Qiita avec l'espoir que quelqu'un qui le connaît pourra signaler les erreurs et donner des conseils.
Je vis une vie professionnelle en tant qu'ingénieur, mais je n'ai pas bien appris les modèles de conception, alors j'ai essayé d'étudier.
Ce qui est décrit ici https://github.com/ck-fm0211/notes_desigh_pattern Je télécharge sur.
J'ai étudié les modèles de conception (mémo personnel) Partie 1 J'ai étudié les modèles de conception (mémo personnel) Partie 2 J'ai étudié les modèles de conception (mémo personnel) Partie 3 J'ai étudié les modèles de conception (mémo personnel) Partie 4 J'ai étudié les modèles de conception (mémo personnel) Partie 5 J'ai étudié les modèles de conception (mémo personnel) Partie 6
«Le but est d'observer les changements d'état, mais l'accent est plutôt mis sur la« notification »que sur« l'observation ». --Lorsque l'état d'une instance change, l'instance elle-même «notifie» le changement d'état à «l'observateur». --Exemple
--Mémento: Souvenir, souvenir
--Une addition ――Ajout de 1 à 5 ...
1+2+3+4+5=15
――Suivant, si vous ajoutez 1 à 10 ...?
--Modèle 1:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 ''
--Modèle 2:
15 + 6 + 7 + 8 + 9 + 10 = 55 ''# -*- coding:utf-8 -*-
class Memento:
"""Classe de souvenir qui garde une trace"""
result = -1 #Représente la progression du calcul
def __init__(self, temp):
"""Constructeur qui reçoit la progression du calcul comme argument"""
Memento.result = temp
class Calc:
"""Une classe qui représente un seul calcul."""
temp = 0
@staticmethod
def plus(plus):
"""Méthode pour effectuer l'addition"""
Calc.temp += plus
@staticmethod
def create_memento():
"""Une méthode pour obtenir la progression comme Memento"""
return Memento(Calc.temp)
@staticmethod
def set_memento(memento: Memento):
"""Obtenez la progression du calcul de Memento et réglez-la sur temp"""
Calc.temp = memento.result
@staticmethod
def get_temp():
"""Méthode pour obtenir le résultat du calcul"""
return Calc.temp
class Calculator:
def __init__(self):
self.result_dict = {}
def run(self):
c = Calc()
#Premier calcul
for i in range(1, 6):
c.plus(i)
print(f"Addition jusqu'à 5: {c.get_temp()}")
self.result_dict["Addition jusqu'à 5"] = c.create_memento()
#Deuxième calcul
c2 = Calc()
c2.set_memento(self.result_dict["Addition jusqu'à 5"])
#Premier calcul
for i in range(6, 11):
c2.plus(i)
print(f"Addition jusqu'à 10: {c2.get_temp()}")
self.result_dict["Addition jusqu'à 10"] = c2.get_temp()
if __name__ == '__main__':
c = Calculator()
c.run()
――En laissant une certaine étape comme "instantané", vous pouvez rapidement revenir à l'état à ce moment-là.
--Conversation au travail ――La façon dont vous attribuez les tâches change en fonction de l'humeur de votre patron (je déteste ce genre de lieu de travail ...) --Quand vous êtes de bonne humeur
Subordonnés: Bonjour
Patron: Bonjour
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bonne chance
--Quand vous êtes de mauvaise humeur
Subordonnés: Bonjour
Patron: Oh
Subordonnés: je vais faire xxx aujourd'hui
Patron: Hey, tu m'as dit de faire ooo? L'AS-tu fait?
Subordonné: (je n'ai pas entendu ...) Je suis désolé, je le ferai bientôt! !! !! !! !! !! !! !!
--Code
# -*- coding:utf-8 -*-
class Boss:
STATE_ORDINARY = 0 #Boss normal
STATE_IN_BAD_MOOD = 1 #Patron de mauvaise humeur
def __init__(self):
self.state = -1 #Représente l'état du boss
def change_state(self, state):
"""Changer le statut de votre patron"""
self.state = state
def morning_greet(self):
"""Retourner le salut du matin"""
if self.state == Boss.STATE_ORDINARY:
return "Bonjour"
elif self.state == Boss.STATE_IN_BAD_MOOD:
return "Oh"
else:
pass
def assign_task(self):
"""Secouez la tâche"""
if self.state == Boss.STATE_ORDINARY:
return "Bon, bonne chance"
elif self.state == Boss.STATE_IN_BAD_MOOD:
return "Hé, tu as dit ooo? L'AS-tu fait?"
else:
pass
――Supposons que le patron de votre patron vous ait signalé et que vous ayez commencé à mieux gérer → Un nouveau modèle est né ――Ce n'est pas cool de modifier la branche if --Dans le modèle State, préparez une classe qui représente "l'état" et rendez cet "état" interchangeable.
# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
class State(metaclass=ABCMeta):
@staticmethod
def morning_greet():
"""Salutation du matin"""
pass
@staticmethod
def assign_task():
"""Secouez la tâche"""
pass
class BadMoodState(State):
@staticmethod
def morning_greet():
return "Oh"
@staticmethod
def assign_task():
return "Hé, tu as dit ooo? L'AS-tu fait?"
class OrdinaryState(State):
@staticmethod
def morning_greet():
return "Bonjour"
@staticmethod
def assign_task():
return "Bon, bonne chance"
class StatePatternBoss:
def __init__(self):
self.state = None
def change_state(self, state: State):
self.state = state
def morning_greet(self):
return self.state.morning_greet()
def assign_task(self):
return self.state.assign_task()
if __name__ == '__main__':
boss_state = StatePatternBoss()
print("=====Jour 1: Bonne humeur=====")
boss_state.change_state(OrdinaryState())
print("Subordonnés: Bonjour")
print(f"patron:{boss_state.morning_greet()}")
print("Subordonnés: je vais faire xxx aujourd'hui")
print(f"patron:{boss_state.assign_task()}")
print("=====Jour 2: mauvaise humeur=====")
boss_state.change_state(BadMoodState())
print("Subordonnés: Bonjour")
print(f"patron:{boss_state.morning_greet()}")
print("Subordonnés: je vais faire xxx aujourd'hui")
print(f"patron:{boss_state.assign_task()}")
=====Jour 1: Bonne humeur=====
Subordonnés: Bonjour
Patron: Bonjour
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bonne chance
=====Jour 2: mauvaise humeur=====
Subordonnés: Bonjour
Patron: Oh
Subordonnés: je vais faire xxx aujourd'hui
Patron: Hey, tu m'as dit de faire ooo? L'AS-tu fait?
―― En faisant cela, il est facile de répondre même si le modèle d'humeur augmente
(Omission)
class GoodMoodState(State):
@staticmethod
def morning_greet():
return "Bonjour! Faisons de notre mieux aujourd'hui!"
@staticmethod
def assign_task():
return "Comme c'est gentil! L'autre ooo était aussi bien! Bonne chance avec cette condition!"
(Omis)
print("=====Jour 3: Bonne humeur=====")
boss_state.change_state(GoodMoodState()) #Changez juste ici
print("Subordonnés: Bonjour")
print(f"patron:{boss_state.morning_greet()}")
print("Subordonnés: je vais faire xxx aujourd'hui")
print(f"patron:{boss_state.assign_task()}")
=====Jour 3: Bonne humeur=====
Subordonnés: Bonjour
Patron: Bonjour! Faisons de notre mieux aujourd'hui!
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bien! L'autre ooo était aussi bien! Bonne chance avec cette condition!
--Flyweight: signifie "fly weight" en anglais
# -*- coding:utf-8 -*-
class HumanLetter:
def __init__(self, letter):
self._letter = letter
def get_letter(self):
return self._letter
class Main:
@staticmethod
def take_a_photo(letter: HumanLetter):
"""Prendre une photo"""
print(letter.get_letter())
def main(self):
"""Créer une lettre"""
a = HumanLetter("Ah")
self.take_a_photo(a)
i = HumanLetter("je")
self.take_a_photo(i)
ha = HumanLetter("Est")
self.take_a_photo(ha)
a2 = HumanLetter("Ah")
self.take_a_photo(a2)
o = HumanLetter("Oh")
self.take_a_photo(o)
yo = HumanLetter("Yo")
self.take_a_photo(yo)
ri = HumanLetter("Ri")
self.take_a_photo(ri)
mo = HumanLetter("Aussi")
self.take_a_photo(mo)
a3 = HumanLetter("Ah")
self.take_a_photo(a3)
o2 = HumanLetter("Oh")
self.take_a_photo(o2)
i2 = HumanLetter("je")
self.take_a_photo(i2)
if __name__ == '__main__':
h = Main()
h.main()
―― Le même caractère apparaît plusieurs fois. ――Si vous venez de prendre une photo, vous pouvez la réutiliser ...
# -*- coding:utf-8 -*-
class HumanLetter:
def __init__(self, letter):
self._letter = letter
def get_letter(self):
return self._letter
class Main:
@staticmethod
def take_a_photo(letter: HumanLetter):
"""Prendre une photo"""
print(letter.get_letter())
def main(self):
"""Créer une lettre"""
a = HumanLetter("Ah")
self.take_a_photo(a)
i = HumanLetter("je")
self.take_a_photo(i)
ha = HumanLetter("Est")
self.take_a_photo(ha)
self.take_a_photo(a)
o = HumanLetter("Oh")
self.take_a_photo(o)
yo = HumanLetter("Yo")
self.take_a_photo(yo)
ri = HumanLetter("Ri")
self.take_a_photo(ri)
mo = HumanLetter("Aussi")
self.take_a_photo(mo)
self.take_a_photo(a)
self.take_a_photo(o)
self.take_a_photo(i)
if __name__ == '__main__':
h = Main()
h.main()
# -*- coding:utf-8 -*-
class HumanLetter:
def __init__(self, letter):
self._letter = letter
def get_letter(self):
return self._letter
class HumanLetterFactory:
__singleton = None
__human_letter = None
def __new__(cls, *args, **kwargs):
if cls.__singleton is None:
cls.__singleton = super(HumanLetterFactory, cls).__new__(cls)
return cls.__singleton
def __init__(self):
self.dic = {}
def get_human_letter(self, letter: str):
try:
human_letter = self.dic[letter]
except KeyError:
human_letter = HumanLetter(letter)
self.dic[letter] = human_letter
return human_letter
class Main:
@staticmethod
def take_a_photo(letter: HumanLetter):
"""Prendre une photo"""
print(letter.get_letter())
def main(self):
"""Créer une lettre"""
#Créer un singleton
hlf = HumanLetterFactory()
a = hlf.get_human_letter("Ah")
self.take_a_photo(a)
print(a)
i = hlf.get_human_letter("je")
self.take_a_photo(i)
print(i)
ha = hlf.get_human_letter("Est")
self.take_a_photo(ha)
a2 = hlf.get_human_letter("Ah")
self.take_a_photo(a2)
print(a2)
o = hlf.get_human_letter("Oh")
self.take_a_photo(o)
print(o)
yo = hlf.get_human_letter("Yo")
self.take_a_photo(yo)
ri = hlf.get_human_letter("Ri")
self.take_a_photo(ri)
mo = hlf.get_human_letter("Aussi")
self.take_a_photo(mo)
a3 = hlf.get_human_letter("Ah")
self.take_a_photo(a3)
print(a3)
o2 = hlf.get_human_letter("Oh")
self.take_a_photo(o2)
print(o2)
i2 = hlf.get_human_letter("je")
self.take_a_photo(i2)
print(i2)
if __name__ == '__main__':
h = Main()
h.main()
Ah
<__main__.HumanLetter object at 0x1039c4da0> #C'est une instance courante dans "A"
je
<__main__.HumanLetter object at 0x1039c4dd8>
Est
Ah
<__main__.HumanLetter object at 0x1039c4da0> #C'est une instance courante dans "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
Yo
Ri
Aussi
Ah
<__main__.HumanLetter object at 0x1039c4da0> #C'est une instance courante dans "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
je
<__main__.HumanLetter object at 0x1039c4dd8>
Recommended Posts