Ich hatte die Gelegenheit, das Besuchermuster in meine Arbeit zu implementieren, und ich habe es nicht klar verstanden. Dies ist eine Zusammenfassung dessen, was ich aus den folgenden Büchern gelernt habe.
Das Besuchermuster kann Datenstruktur und Verarbeitung trennen.
Das Besuchermuster ist in eine Klasse unterteilt, die Daten enthält, und eine Klasse, die den Algorithmus implementiert (Besucherklasse).
Wenn Ihre Anwendung eine Datenstruktur enthält und einige Algorithmen auf diese Datenstruktur zugreifen
Das Besuchermuster ermöglicht es der Datenstruktur, sich auf das Speichern und Zugreifen auf Daten zu konzentrieren.
Sie können die Funktionalität erweitern, ohne die vorhandene Klasse zu ändern. (Prinzip offen / geschlossen)
Viele Elemente sind in der Datenstruktur gespeichert, und ich möchte für jedes Element eine Verarbeitung durchführen.
Wo soll ich zu diesem Zeitpunkt den "Verarbeitungs" -Code schreiben? Wenn Sie in eine Klasse schreiben, die die Datenstruktur darstellt ** Die Datenstrukturklasse muss jedes Mal geändert werden, wenn eine neue Verarbeitung erforderlich ist. ** ** **
Das Besuchermuster hat sich bei der Lösung der oben genannten Probleme als nützlich erwiesen.
Gemäß Einführung in in Java-Sprache erlernte Entwurfsmuster sind die folgenden Beziehungen zwischen Datenstrukturklassen und Algorithmen zugeordnet, die Algorithmen beschreiben. es gibt.
Die Klasse, die die Datenstruktur enthält, sei die Klasse "Visitable", und die Klasse, die den Algorithmus für die Datenstruktur beschreibt, sei die Klasse "Visitor".
Definieren Sie die Methode "visit (visitable)" in der Klasse "Visitor".
Schreiben Sie in visit ()
den Algorithmus, während Sie auf die Attribute und das Verhalten der Klasse der Datenstruktur zugreifen.
Andererseits definiert die Klasse "Visitable" die Methode "accept (Besucher)". Rufen Sie innerhalb von "Akzeptieren (Besucher)" "Besuchen ()" des im ** Argument übergebenen Besucherobjekts auf. ** ** **
Beschreibt eine Datenstrukturklasse (Visitable-Klasse).
Beschreibt eine Klasse, die Daten vom Listentyp enthält, und eine Klasse, die Daten vom Typ Wörterbuch enthält.
Definieren Sie eine Methode (accept ()
), die die Visitor-Klasse in jeder Klasse akzeptiert.
visitable.py
class VisitableList(list):
def accept(self, visitor):
visitor.visit_list(self)
class VisitableDict(dict):
def accept(self, visitor):
visitor.visit_dict(self)
Schreiben Sie als Nächstes die Visitor-Klasse, die den Algorithmus beschreibt. Im folgenden Code werden die Daten, die von der Klasse der oben beschriebenen Datenstruktur gehalten werden, einfach als Standard ausgegeben.
visitor.py
class Printer(object):
def visit_list(self, instance):
print('Der Inhalt der Liste: {}'.format(instance))
def visit_dict(self, instance):
print('Schlüssel im Wörterbuch: {}'.format(
', '.join(instance.keys())
))
Verwenden Sie dann die Datenstrukturklasse und die Besucherklasse, wie im folgenden Beispielcode gezeigt.
Erstellen Sie ein Objekt der Klasse der Datenstruktur,
Datenstrukturobjekt .accept (Besucherobjekt)
Es wird beschrieben als.
main.py
def main():
vistitable_list = VisitableList([1, 2, 3, 5])
vistitable_list.accept(Printer())
vistitable_dict = VisitableDict({'one': 1, 'two': 2, 'three': 3})
vistitable_dict.accept(Printer())
if __name__ == "__main__":
main()
$ python main.py
Der Inhalt der Liste: [1, 2, 3, 5]
Schlüssel im Wörterbuch: one, two, three
Selbstbeobachtung ist die Art und Abdeckung eines Objekts (in diesem Fall eines Objekts). Eine Funktion, die untersucht werden kann, um das Mögliche abzudecken.
Das Verweisen oder Abrufen von "welche Eigenschaften haben" für ein Objekt wird beispielsweise als Selbstbeobachtung bezeichnet.
Der folgende Code nutzt die Eigenschaften der Selbstbeobachtung und beschreibt eine Klasse, die die Besucherklasse und die Besucherklasse verbindet.
class Connect():
def __init__(self, visited, vistor):
self.__cls = visited.__class__.__name__
self.__method_name = 'visit_%s' % self.__cls
self.__method = getattr(vistor, self.__method_name, None)
# visit()Implementiert
self.__method(visited)
vistied .__ class .___ name__
undgetattr ()
sind Introspektionen.
Implementieren Sie es im folgenden Code mit der zuvor beschriebenen Druckerklasse.
main.py
if __name__ == "__main__":
Connect([1, 2, 3], Printer())
$ python main.py
Der Inhalt der Liste: [1, 2, 3]
Schlüssel im Wörterbuch: one, two, three
Introspection macht die Implementierung von accept () in der Visitor-Klasse überflüssig.
In Einführung in in Java-Sprache erlernte Entwurfsmuster als Grundform, Definieren Sie die Methode "accept ()" in der Datenstrukturklasse und die Methode "visit ()" in der Klasse, die den Algorithmus implementiert. Dann rufen wir innerhalb der definierten Methode die Methoden des anderen auf. (Eine Technik namens Doppelversand)
In Expert Python Programming Revised 2nd Edition sind die Attribute von Objekten in Python dynamisch Als Ergebnis wurde festgestellt, dass das Besuchermuster ohne Verwendung der accept () -Methode implementiert werden konnte.
In jedem Fall denke ich, dass es notwendig ist, die visit () -Methode in der Definitionsklasse (Visitor
) mit ausreichender Kenntnis der Attribute und des Verhaltens der Klasse in der Datenstruktur zu implementieren.
Recommended Posts