Définition du visiteur: une opération qui agit sur chaque objet dans un certain groupe d'objets. Il vous permet de définir de nouvelles opérations qui agissent sur ces objets sans les changer eux-mêmes.
En Java, le modèle des visiteurs sépare en fait les éléments de la structure de collecte et le comportement de fonctionnement sur ces éléments.
Pourquoi utiliser le mode visiteur
La collection Java (y compris le vecteur et le hachage) est la technologie que nous utilisons le plus souvent, mais la collection semble être une grande TVA de teinture noire. Ensuite, nous devons utiliser si pour juger, comme:
La copie de code est la suivante:
Iterator iterator = collection.iterator ()
while (iterator.hasnext ()) {
Objet o = iterator.next ();
if (o instanceof Collection)
MessyPrintCollection ((Collection) O);
else if (o instanceof string)
System.out.println ("'" + o.toString () + "'");
else if (o instanceof float)
System.out.println (O.ToString () + "F");
autre
System.out.println (O.ToString ());
}
Dans l'exemple ci-dessus, nous avons utilisé l'instance de déterminer le type de o.
De toute évidence, les inconvénients de le faire si sinon si le code est lourd, nous pouvons le résoudre à l'aide du mode visiteur.
Comment utiliser le mode visiteur
Pour l'exemple ci-dessus, nous concevons un visiteur du visiteur d'interface:
La copie de code est la suivante:
Visiteur d'interface publique
{
Public Void VisitCollection (Collection Collection);
public void VisitString (chaîne de chaîne);
public void Visitfloat (flotteur float);
}
Dans cette interface, mettez les types de classes que nous pensons que la collection est possible.
Avec les visiteurs, nous devons être visités. ne l'accueille pas, le visiteur ne pourra pas visiter).
Nous définissons cette interface comme visite, qui est de définir une opération d'acceptation, c'est-à-dire que chaque élément de la collection accessible.
La copie de code est la suivante:
Interface publique Visitable {
Le public vide accepte (visiteur des visiteurs);
}
Ok, avec deux interfaces, nous devons définir leur implémentation spécifique (classe concrète):
La copie de code est la suivante:
Classe publique Concreteelement implémente visible
{
valeur de chaîne privée;
public ConcreteElement (String String) {
valeur = chaîne;
}
// Définir le contenu spécifique de l'acceptation ici est une phrase très simple pour appeler le vide public accepter (visiteur du visiteur) {
Visitor.Visitstring (this);
}
}
Jetons un coup d'œil à l'implémentation concrète du visiteur:
La copie de code est la suivante:
Classe publique ConcretEvisitor implémente le visiteur
{
// Dans cette méthode, nous mettons en œuvre un accès réussi aux éléments de la collection publique Void VisitCollection (Collection Collection) {
Iterator iterator = collection.iterator ()
while (iterator.hasnext ()) {
Objet o = iterator.next ();
si (o instance de visite)
((Visitable) o) .Accept (ceci);
}
public void VisitString (String String) {
System.out.println ("'" + String + "'");
}
public void Visitfloat (float float) {
System.out.println (float.toString () + "f");
}
}
Dans le VisitCollection ci-dessus, nous mettons en œuvre l'accès à chaque élément de la collection, en utilisant une seule déclaration de jugement, juste pour déterminer s'il est accessible.
À ce stade, nous avons terminé l'architecture de base du modèle des visiteurs.
Prérequis pour l'utilisation du mode visiteur
Le type d'objet dans la structure du groupe d'objets est rarement modifié, c'est-à-dire que le type d'identité du visiteur est rarement modifié, comme le type de visiteur ci-dessus est rarement modifié, si de nouvelles opérations sont nécessaires, comme dans l'exemple ci-dessus, nous En plus de la mise en œuvre spécifique au Concreteelement, le nouveau ConcreteElement2 ConcreteElement3 est également nécessaire.
On peut voir qu'il existe une condition préalable à l'utilisation du mode visiteur.
Si le visiteur change également fréquemment, c'est-à-dire que les types d'objets dans le groupe d'objets changent souvent, la suggestion générale est qu'il est préférable de définir les opérations une par une dans ces classes d'objets, mais la technologie de réflexion de Java résout ce problème.