Mode des visiteurs: encapsuler certaines opérations qui agissent sur chaque élément d'une certaine structure de données. Il peut définir de nouvelles opérations qui agissent sur ces éléments sans modifier cette structure de données. Le diagramme de structure du mode visiteur est le suivant:
D'après l'image ci-dessus, vous pouvez voir qu'il a les personnages suivants:
Rôle du visiteur abstrait: définit une interface et déclare une ou plusieurs opérations d'accès.
Rôle du visiteur concret: implémente l'interface déclarée par les visiteurs abstraits, c'est-à-dire les diverses opérations d'accès déclarées par les visiteurs abstraits.
Élément abstrait (Visitable) Rôle: déclare une opération d'acceptation, acceptant un objet visiteur comme paramètre.
Rôle de l'élément concret: met en œuvre l'opération d'acceptation spécifiée par les nœuds abstraits.
Rôle d'objet de structure de données (objetStructure): il peut traverser tous les éléments de la structure et fournir une interface pour l'objet visiteur pour accéder à chaque élément.
Le code de simulation est le suivant:
Visiteur d'interface {Vide Visit (Gladiambus G); VOITE VOIDE (Chrysanthemum C); } // Classe d'accès du nom de visiteur en béton StringVisitor implémente le visiteur {String S; public String toString () {return s; } Public Void Visit (Gladilighs G) {S = "Gladiomate"; } Public Void Visit (Chrysanteum C) {S = "Chrysanteumm"; }} // Classe de visiteurs concrètes Beevisitor implémente le visiteur {Public Void Visit (Gladilighus G) {System.out.println ("Bee pour accéder à Glaïeurs"); } Public Void Visit (Chrysantem C) {System.out.println ("Bee pour accéder à Chrysanteum"); }} Fleur d'interface {vide accepter (visiteur v); } / * * Élément en béton Chrysanthemum implémente la fleur {public vide accepte (visiteur v) {v.visit (this); }} // Classe d'éléments concrètes Gladiolus implémente Flower {public vide accepter (Visitor v) {v.Visit (this); }} // Ceci est une classe de générateur d'objets de fleur FlowerGenerator {private static random rand = new random (); public static fleur newflower () {switch (rand.nextint (2)) {par défaut: cas 0: return new Gladiaud (); Cas 1: Renvoie un nouveau chrysanthemum (); }}} Classe publique Test {/ * * Tout d'abord, obtenez un rôle de visiteur spécifique sur le client. La structure de l'objet est traversée. Appelez la méthode d'acceptation pour chaque élément et passez le rôle spécifique du visiteur dans. Cela complète l'ensemble du processus * / public static void main (String args []) {list <flower> fleurs = new ArrayList <Flower> (); pour (int i = 0; i <10; i ++) fleurs.add (FlowerGenerator.Newflower ()); Visitor Visitor = new StringVisitor (); Iterator <Flower> iterator = fleurs.iterator (); while (iterator.hasnext ()) {iterator.next (). accepter (visiteur); System.out.println (visiteur); } System.out.println ("-----------------------"); / * * Un nouveau comportement d'accès: Beevisitor Bee Access * / Visitor Visitor2 = new BeeVisitor (); pour (fleur de fleur: fleurs) {fleur.accept (visiteur2); }}}résultat:
Glaïeul chrysanthemum chrysanthemum glaïeul chrysanthemum chrysanthemum chrysanthemum chrysanthemum glaïelise glaïelise -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Le mode visiteur peut être pris en compte si:
1. Une structure d'objets contient de nombreux objets de classe, et ils ont des interfaces différentes, et vous souhaitez implémenter certaines opérations qui dépendent de leurs classes spécifiques sur ces objets.
2. Vous devez effectuer de nombreuses opérations différentes et non pertinentes sur des objets dans une structure d'objets, et vous voulez éviter de laisser ces opérations "polluer" les classes de ces objets. Le visiteur vous permet de concentrer les opérations connexes et de les définir dans une classe.
3. Lorsque la structure de l'objet est partagée par de nombreuses applications, utilisez le mode visiteur pour permettre à chaque application de contenir uniquement les opérations qui doivent être utilisées.
4. Les classes qui définissent la structure des objets changent rarement, mais de nouvelles opérations sont souvent nécessaires pour définir cette structure. La modification de la classe de structure d'objets nécessite de redéfinir l'interface en tous les visiteurs, ce qui peut être un coût important. Si la classe de structure d'objet change fréquemment, il peut être préférable de définir ces opérations dans ces classes.
Ces individus semblent être des suggestions et des problèmes spécifiques doivent être analysés dans le projet.