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
-Le motif composite facilite la manipulation des structures récursives en "identifiant le contenu avec le conteneur".
class File:
def __init__(self, name):
self._name = name
def remove(self):
print("{}A été supprimée".format(self._name))
class Directory:
def __init__(self, name):
self._name = name
self._list = []
def add(self, arg):
self._list.append(arg)
def remove(self):
itr = iter(self._list)
i = 0
while next(itr, None) is not None:
obj = self._list[i]
if isinstance(obj, File):
obj.remove()
elif isinstance(obj, Directory):
obj.remove()
else:
print("Ne peut pas être supprimé")
i += 1
print("{}A été supprimée".format(self._name))
if __name__ == "__main__":
file1 = File("file1")
file2 = File("file2")
file3 = File("file3")
file4 = File("file4")
dir1 = Directory("dir1")
dir1.add(file1)
dir2 = Directory("dir2")
dir2.add(file2)
dir2.add(file3)
dir1.add(dir2)
dir1.add(file4)
dir1.remove()
class DirectoryEntry(metaclass=ABCMeta):
@abstractmethod
def remove(self):
pass
--Définissez uniquement la méthode remove dans l'interface DirectoryEntry --Implémenter la classe File et la classe Directory sous la forme de l'implémentation de ceci.
class File(DirectoryEntry):
def __init__(self, name):
self._name = name
def remove(self):
print("{}A été supprimée".format(self._name))
class Directory(DirectoryEntry):
def __init__(self, name):
self._name = name
self._list = []
def add(self, entry: DirectoryEntry):
self._list.append(entry)
def remove(self):
itr = iter(self._list)
i = 0
while next(itr, None) is not None:
obj = self._list[i]
obj.remove()
i += 1
print("{}A été supprimée".format(self._name))
class SymbolicLink(DirectoryEntry):
def __init__(self, name):
self._name = name
def remove(self):
print("{}A été supprimée".format(self._name))
――A la boutique de crème glacée, vous pouvez choisir librement les garnitures. Le client n'a pas à faire de garnitures et peut sélectionner plusieurs garnitures en couches. --Définissez l'interface suivante comme interface commune pour la crème glacée.
class Icecream(metaclass=ABCMeta):
@abstractmethod
def get_name(self):
pass
@abstractmethod
def how_sweet(self):
pass
―― En tant que classes avec ces interfaces, la classe de crème glacée à la vanille, la classe de crème glacée au matcha, etc. sont fournies comme suit.
class VanillaIcecream(Icecream):
def get_name(self):
return "Glace à la vanille"
def how_sweet(self):
return "Saveur vanille"
class GreenTeaIcecream(Icecream):
def get_name(self):
return "Glace au matcha"
def how_sweet(self):
return "Saveur de matcha"
class CashewNutsVanillaIcecream(Icecream):
def get_name(self):
return "Glace aux noix de cajou et à la vanille"
«Ce genre d '« ajout de fonctions utilisant l'héritage »devient très fixe. --Par exemple, si vous voulez une instance qui représente la crème glacée au matcha avec des noix de cajou, vous avez besoin de la classe de succession de crème glacée au matcha.
class CashewNutsToppingIcecream(Icecream):
def __init__(self, ice: Icecream):
self._ice = ice
def get_name(self):
name = "Noix de cajou"
name += self._ice.get_name()
return name
def how_sweet(self):
return self._ice.how_sweet()
--CashewNutsToppingIcecream classe est une classe qui représente la crème glacée garnie de noix de cajou. --Cette classe implémente l'interface Icecream, et sa méthode getName () renvoie la valeur obtenue par getName () de sa propre variable d'instance ice (instance Icecream) plus la chaîne "noix de cajou". Renvoie comme. De plus, dans la méthode howSweet (), la valeur de retour de la méthode howSweet () de la variable d'instance ice est renvoyée telle quelle. ―― En concevant comme ceci, comme indiqué ci-dessous, de la glace à la vanille garnie de noix de cajou, de la crème glacée au matcha garnie de noix de cajou, de la glace à la vanille garnie d'amandes tranchées, d'amandes tranchées et de noix de cajou. Il est possible de garnir dans diverses combinaisons telles que la crème glacée à la vanille garnie des deux.
ice1 = CashewNutsToppingIcecream(VanillaIcecream()) #Glace à la vanille avec garniture de noix de cajou
ice2 = CashewNutsToppingIcecream(GreenTeaIcecream()) #Glace au matcha avec garniture de noix de cajou
--Dans le modèle Visiteur, il est facile d'ajouter un traitement en décrivant le "traitement" dans l'objet Visiteur qui est le visiteur.
# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
#Classe des enseignants
class Teacher(metaclass=ABCMeta):
def __init__(self, students):
self._students = students
@abstractmethod
def visit(self, student_home):
getattr(self, 'visit_' + student_home.__class__.__name__.lower())(student_home)
@abstractmethod
def get_student_list(self):
return self._students
#Classe de professeur débutant
class RookieTeacher(Teacher):
def __init__(self, students):
super().__init__(students)
def visit(self, student_home):
print("Bonjour enseignant")
super().visit(student_home)
@staticmethod
def visit_tanaka(tanaka):
tanaka.praised_child()
@staticmethod
def visit_suzuki(suzuki):
suzuki.reproved_child()
def get_student_list(self):
return self._students
#Cours à domicile
class Home(metaclass=ABCMeta):
@staticmethod
def praised_child():
pass
@staticmethod
def reproved_child():
pass
#Interface d'acceptation
class TeacherAcceptor(metaclass=ABCMeta):
def accept(self, teacher: Teacher):
pass
#La famille de Suzuki
class Suzuki(Home, TeacherAcceptor):
@staticmethod
def praised_child():
print("Suzuki Mother: Oh, si tu es professeur, fais une blague")
@staticmethod
def reproved_child():
print("Suzuki Mother: C'est seulement pour mon enfant ...")
def accept(self, teacher: Teacher):
teacher.visit(self.__class__)
#La famille de M. Tanaka
class Tanaka(Home, TeacherAcceptor):
@staticmethod
def praised_child():
print("Tanaka Mother: Oh, si vous êtes enseignant, faites une blague")
@staticmethod
def reproved_child():
print("Mère Tanaka: Pas question, c'est seulement pour mon enfant ...")
def accept(self, teacher: Teacher):
teacher.visit(self.__class__)
if __name__ == "__main__":
rt = RookieTeacher(["suzuki", "tanaka"])
rt.visit(Suzuki())
rt.visit(Tanaka())
―― La méthode d'acceptation de chaque ménage appelle la méthode de visite de l'enseignant (visiteur) pour réaliser un traitement commun.
――Je pense qu'il y a un meilleur exemple ...
Recommended Posts