[PYTHON] Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.

Einführung

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.

Vergangenes Protokoll

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

Zusammengesetztes Muster

-Das zusammengesetzte Muster erleichtert die Handhabung rekursiver Strukturen, indem "der Inhalt mit dem Container identifiziert wird". --Beispiel: Dateisystem

Eigentlich verwenden

Gegenstand

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))

Zusammenfassung des zusammengesetzten Musters

Composite.png

Dekorationsmuster

Eigentlich verwenden

Gegenstand

――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

Zusammenfassung der Dekorationsmuster

Decorator.png

Besuchermuster

Eigentlich verwenden

Gegenstand

# -*- 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.

Zusammenfassung der Besuchermuster

Visitor.png

Impressionen

――Ich denke, es gibt ein besseres Beispiel ...

Recommended Posts

Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 3 (Prototypmuster, Builder-Muster) studiert.
Ich habe über Designmuster studiert (persönliches Memo) Teil 4 (AbstractFactory-Muster, Brückenmuster, Strategiemuster)
Ich habe über Entwurfsmuster (persönliches Memo) Teil 8 (Proxy-Muster, Befehlsmuster, Interpreter-Muster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 7 (Beobachtermuster, Erinnerungsmuster, Zustandsmuster, Fliegengewichtsmuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 6 (Muster der Verantwortungskette, Fassadenmuster, Vermittlermuster) studiert.
Entwurfsmuster #Decorator
Über das Besuchermuster
Ich habe richtig über Systemd gelernt