Dieser Artikel ist ein persönliches Studienmemo. Ich schreibe einen Artikel, der von der Besessenheit getrieben ist, dass das, was ich eingebe, ausgegeben werden muss. Ich schreibe diesen Artikel über Qiita in der Hoffnung, dass jemand, der damit vertraut ist, auf Fehler hinweisen und Ratschläge geben kann.
Ich lebe ein Berufsleben als Ingenieur, aber ich habe nicht richtig über Entwurfsmuster gelernt, also habe ich versucht zu studieren.
Was ist hier beschrieben https://github.com/ck-fm0211/notes_desigh_pattern Ich lade auf.
Ich habe über Entwurfsmuster (persönliches Memo) Teil 1 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 2 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 3 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 4 studiert
-Das zusammengesetzte Muster erleichtert die Handhabung rekursiver Strukturen, indem "der Inhalt mit dem Container identifiziert wird". --Beispiel: Dateisystem
class File:
def __init__(self, name):
self._name = name
def remove(self):
print("{}Wurde gelöscht".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("Kann nicht gelöscht werden")
i += 1
print("{}Wurde gelöscht".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
class File(DirectoryEntry):
def __init__(self, name):
self._name = name
def remove(self):
print("{}Wurde gelöscht".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("{}Wurde gelöscht".format(self._name))
class SymbolicLink(DirectoryEntry):
def __init__(self, name):
self._name = name
def remove(self):
print("{}Wurde gelöscht".format(self._name))
――In der Eisdiele können Sie Beläge frei wählen. Der Kunde muss keine Beläge herstellen und kann mehrere Beläge in Schichten auswählen.
class Icecream(metaclass=ABCMeta):
@abstractmethod
def get_name(self):
pass
@abstractmethod
def how_sweet(self):
pass
――Als Klassen mit diesen Schnittstellen werden Vanilleeisklasse, Matcha-Eisklasse usw. wie folgt bereitgestellt.
class VanillaIcecream(Icecream):
def get_name(self):
return "Vanille-Eiscreme"
def how_sweet(self):
return "Vanillegeschmack"
class GreenTeaIcecream(Icecream):
def get_name(self):
return "Matcha-Eis"
def how_sweet(self):
return "Matcha-Geschmack"
class CashewNutsVanillaIcecream(Icecream):
def get_name(self):
return "Cashewnuss-Vanilleeis"
――Diese Art der "Hinzufügung von Funktionen durch Vererbung" wird sehr fest.
class CashewNutsToppingIcecream(Icecream):
def __init__(self, ice: Icecream):
self._ice = ice
def get_name(self):
name = "Cashewnüsse"
name += self._ice.get_name()
return name
def how_sweet(self):
return self._ice.how_sweet()
--CashewNutsToppingIcecream-Klasse ist eine Klasse, die Eiscreme mit Cashewnüssen darstellt. --Diese Klasse implementiert die Icecream-Schnittstelle und die Methode getName () gibt den Wert zurück, den getName () für die eigene Instanzvariable ice (Icecream-Instanz) plus die Zeichenfolge "Cashewnüsse" erhalten hat. Rückgabe als. Darüber hinaus gibt die howSweet () -Methode den Rückgabewert der howSweet () -Methode der Instanzvariablen ice unverändert zurück. ――Mit diesem Design, wie unten gezeigt, Vanilleeis mit Cashewnüssen, Matcha-Eis mit Cashewnüssen, Vanilleeis mit Mandelscheiben, Mandelscheiben und Cashewnüssen. Es ist möglich, verschiedene Kombinationen wie Vanilleeis mit beiden zu belegen.
ice1 = CashewNutsToppingIcecream(VanillaIcecream()) #Vanilleeis mit Cashewnuss-Belag
ice2 = CashewNutsToppingIcecream(GreenTeaIcecream()) #Matcha-Eis mit Cashewnuss-Belag
# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
#Lehrerklasse
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
#Anfängerlehrerklasse
class RookieTeacher(Teacher):
def __init__(self, students):
super().__init__(students)
def visit(self, student_home):
print("Hallo Lehrer")
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
#Heimklasse
class Home(metaclass=ABCMeta):
@staticmethod
def praised_child():
pass
@staticmethod
def reproved_child():
pass
#Akzeptanzschnittstelle
class TeacherAcceptor(metaclass=ABCMeta):
def accept(self, teacher: Teacher):
pass
#Suzukis Familie
class Suzuki(Home, TeacherAcceptor):
@staticmethod
def praised_child():
print("Suzuki Mutter: Oh, wenn du Lehrer bist, mach einen Witz")
@staticmethod
def reproved_child():
print("Suzuki Mutter: Das ist nur für mein Kind ...")
def accept(self, teacher: Teacher):
teacher.visit(self.__class__)
#Mr. Tanakas Familie
class Tanaka(Home, TeacherAcceptor):
@staticmethod
def praised_child():
print("Tanaka Mutter: Oh, wenn Sie Lehrer sind, machen Sie einen Witz")
@staticmethod
def reproved_child():
print("Tanaka Mutter: Auf keinen Fall, das ist nur für mein Kind ...")
def accept(self, teacher: Teacher):
teacher.visit(self.__class__)
if __name__ == "__main__":
rt = RookieTeacher(["suzuki", "tanaka"])
rt.visit(Suzuki())
rt.visit(Tanaka())
――Die Akzeptanzmethode jedes Haushalts nennt die Besuchsmethode des Lehrers (Besuchers), um eine gemeinsame Verarbeitung zu realisieren.
――Ich denke, es gibt ein besseres Beispiel ...
Recommended Posts