Besuchermodus: In einer bestimmten Datenstruktur auf jedes Element einbinden, die auf jedes Element wirken. Es kann neue Operationen definieren, die auf diese Elemente wirken, ohne diese Datenstruktur zu ändern. Das Strukturdiagramm des Besuchermodus lautet wie folgt:
Aus dem obigen Bild können Sie sehen, dass er die folgenden Zeichen hat:
Zusammenfassung Besucherrolle: Definiert eine Schnittstelle und deklariert einen oder mehrere Zugriffsvorgänge.
Konkrete Besucherrolle: Implementiert die von abstrakten Besuchern deklarierte Schnittstelle, dh die verschiedenen von abstrakten Besuchern deklarierten Zugriffsvorgänge.
Abstract Element (Visiable) Rolle: deklariert einen Akzeptanzbetrieb und akzeptiert ein Besucherobjekt als Parameter.
KonkreteElementrolle: Implementiert die von abstrakten Knoten angegebene Akzeptanzoperation.
Datenstrukturobjekt (Objektstruktur) Rolle: Sie kann alle Elemente in der Struktur durchqueren und eine Schnittstelle für das Besucherobjekt bereitstellen, um auf jedes Element zuzugreifen.
Der Simulationscode lautet wie folgt:
Schnittstellenbesucher (void Visit (Gladiolus g); Void -Besuch (Chrysanthemen C); }
// Concrete Visitor Name Access Class String Visor implementiert Besucher {String s; public String toString () {return s; } public void Visit (Gladiolus g) {S = "Gladiolus"; } public void Visit (chrysanteumum c) {s = "chrysanteumum"; }} // Concrete Visitor Class Beevisitor implementiert Besucher (public void Visit (Gladiolus g) {System.out.println ("Bee, um auf Gladiolus zuzugreifen"); } public void Visit (chrysanteum c) {System.out.println ("Bee, um auf Chrysanteum zuzugreifen"); }} Schnittstellenblume {void Accept (Besucher v); } / * * konkretes Element chrysanthemum implementiert Blume {public void Accept (Besucher v) {v.vissit (this); }} // Concrete Element Class Gladiolus implementiert Blume {public void Accept (Besucher v) {v.vissit (this); }} // Dies ist eine Blumenobjektgeneratorklasse FlowerGenerator {private static random rand = new random (); public static Flower newflower () {switch (rand.Nextint (2)) {Standard: Fall 0: Neue Gladiolus () zurückgeben; Fall 1: Rückgabe neuer Chrysanthemen (); }}} Öffentliche Klassentest { / * * Erstens eine bestimmte Besucherrolle im Kunden. Die Objektstruktur wird durchquert. Rufen Sie die Akzeptanzmethode für jedes Element auf und übergeben Sie die spezifische Besucherrolle in. Dadurch wird der gesamte Prozess abgeschlossen. für (int i = 0; i <10; i ++) Blumen.Add (Blumengenerator.NewFlower ()); Besucher Besucher = neuer Stringvisor (); Iterator <Blower> iterator = Blumen.Inerator (); while (iterator.hasnext ()) {iterator.next (). Accept (Besucher); System.out.println (Besucher); } System.out.println ("-----------------------"); /** Ein neues Zugriffsverhalten: Beeevisitor Bee Access*/ Besucher Besucher2 = neuer Beeevisitor (); für (Blumenblume: Blumen) {Blume.Accept (Besucher2); }}}Ergebnis:
Gladiolus Chrysanthemum Chrysantheme Gladiolus Chrysantheme Chrysanthemum Chrysanthemum Chrysantheme Gladiolus Gladiolus ---------------------------------------------------------------------------------------------------------------------------------------------------------
Der Besuchermodus kann berücksichtigt werden, wenn:
1. Eine Objektstruktur enthält viele Klassenobjekte, und sie haben unterschiedliche Schnittstellen, und Sie möchten einige Vorgänge implementieren, die von ihren spezifischen Klassen in diesen Objekten abhängen.
2. Sie müssen viele verschiedene und irrelevante Operationen für Objekte in einer Objektstruktur ausführen, und Sie möchten vermeiden, dass diese Operationen die Klassen dieser Objekte "verschmutzen". Mit Besuchern können Sie im Zusammenhang mit den damit verbundenen Operationen konzentrieren und in einer Klasse definieren.
3. Wenn die Objektstruktur von vielen Anwendungen geteilt wird, verwenden Sie den Besuchermodus, um jeder Anwendung nur die Vorgänge zu enthalten, die verwendet werden müssen.
4. Die Klassen, die die Objektstruktur definieren, ändern sich selten, aber häufig werden neue Operationen benötigt, um diese Struktur zu definieren. Um die Objektstrukturklasse zu ändern, ist die Neudefinition der Schnittstelle an alle Besucher neu definiert, was große Kosten sein können. Wenn sich die Objektstrukturklasse häufig ändert, ist es möglicherweise besser, diese Operationen in diesen Klassen zu definieren.
Diese Personen scheinen Vorschläge zu sein, und spezifische Probleme müssen im Projekt analysiert werden.