Besucherdefinition: Eine Operation, die auf jedes Objekt in einer bestimmten Objektgruppe wirkt. Sie können neue Operationen definieren, die auf diese Objekte reagieren, ohne sie selbst zu ändern.
In Java trennt das Besuchermuster die Elemente in der Sammelstruktur und das Verhalten des Betriebs auf diesen Elementen.
Warum den Besuchermodus verwenden
Die Java -Sammlung (einschließlich Vektor und Hashtable) ist die Technologie, die wir am häufigsten verwenden, aber die Sammlung scheint eine große schwarz -färbende MwSt. Dann müssen wir verwenden, wenn wir beurteilen, wie:
Die Codekopie lautet wie folgt:
Iterator Iterator = Collection.iterator ()
while (iterator.hasnext ()) {
Objekt o = iterator.next ();
if (o Instanz der Sammlung)
MessyPrintcollection ((Sammlung) O);
sonst wenn (o Instanz von String)
System.out.println ("'"+o.toString ()+"'");
sonst wenn (o Instanz des Floats)
System.out.println (O.ToString ()+"f");
anders
System.out.println (O.ToString ());
}
Im obigen Beispiel haben wir Instanz verwendet, um die Art von O zu bestimmen.
Offensichtlich können die Nachteile, wenn der Code umständlich ist, ihn mit dem Besuchermodus lösen.
So verwenden Sie den Besuchermodus
Für das obige Beispiel entwerfen wir einen Interface -Besucherbesucher:
Die Codekopie lautet wie folgt:
Öffentliche Schnittstelle Besucher
{
öffentliche void VisitCollection (Sammlung Sammlung);
public void VisitString (String String);
öffentliche Leere Visitfloat (Float Float);
}
Setzen Sie in dieser Schnittstelle die Arten von Klassen ein, die wir für möglich halten.
Mit Besuchern müssen wir besucht werden. begrüßt ihn nicht, der Besucher kann nicht besuchen).
Wir definieren diese Schnittstelle als besucht, nämlich einen Akzeptanzvorgang, dh jedes Element der Sammlung zugänglich zu machen.
Die Codekopie lautet wie folgt:
öffentliche Schnittstelle besucht {
öffentliche Leere Akzeptanz (Besucherbesucher);
}
OK, mit zwei Schnittstellen müssen wir ihre spezifische Implementierung (konkrete Klasse) definieren:
Die Codekopie lautet wie folgt:
Betonklasse im öffentlichen Klassen implementiert besucht
{
privater Stringwert;
public ConcreteElement (String String) {
Value = String;
}
// Definieren Sie den spezifischen Inhalt von Akzeptieren hier ist ein sehr einfacher Satz, um öffentliche void Accept (Besucher Besucher) {zu bezeichnen
Visitor.vissitString (this);
}
}
Werfen wir einen Blick auf die konkrete Implementierung des Besuchers:
Die Codekopie lautet wie folgt:
öffentliche Klasse ConcreteVisitor implementiert Besucher
{
// In dieser Methode implementieren wir einen erfolgreichen Zugriff auf die Elemente der Sammlung Public Void VisitCollection (Sammlung Sammlung) {
Iterator Iterator = Collection.iterator ()
while (iterator.hasnext ()) {
Objekt o = iterator.next ();
if (o Instanz des Besuchs)
((Besucht) o) .Accept (dies);
}
public void VisitString (String String) {
System.out.println ("'"+String+"'");
}
public void Visitfloat (Float Float) {
System.out.println (float.toString ()+"f");
}
}
In der obigen VisitCollection implementieren wir den Zugriff auf jedes Element der Sammlung mit nur einer Urteilsanweisung, um festzustellen, ob sie zugänglich ist.
Zu diesem Zeitpunkt haben wir die grundlegende Architektur des Besuchermodells abgeschlossen.
Voraussetzungen für die Verwendung des Besuchermodus
Der Objekttyp in der Objektgruppenstruktur wird selten geändert, dh der Identitätstyp des Besucher Zusätzlich zur konkretenspezifischen Implementierung ist auch die neue BetonkonkreteElement3 erforderlich.
Es ist zu erkennen, dass es eine Voraussetzung für die Verwendung des Besuchermodus gibt.
Wenn sich der Besucher auch häufig ändert, dh die Objekttypen in der Objektgruppe ändert sich häufig, ist der allgemeine Vorschlag, dass es besser ist, Operationen einzeln in diesen Objektklassen zu definieren, aber Javas reflektierende Technologie löst dieses Problem.