Voici un résumé du ** modèle de visiteur ** dans le modèle de conception du GoF.
Un programme qui affiche une liste de répertoires et de fichiers.
Une interface qui représente une structure de données qui accepte des instances de la classe Visitor.
Element.java
public interface Element {
public abstract void accept(Visitor v);
}
Il s'agit de la classe de base pour les fichiers et répertoires. Implémentez l'interface Element.
Entry.java
public abstract class Entry implements Element {
public abstract String getName();
public String toString() {
return getName();
}
}
Une classe qui représente un fichier. Ce sera un hôte pour les visiteurs.
File.java
public class File extends Entry {
private String name;
public File(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void accept(Visitor v) {
v.visit(this);
}
}
Une classe qui représente un répertoire. Ce sera un hôte pour les visiteurs.
Directory.java
import java.util.ArrayList;
import java.util.Iterator;
public class Directory extends Entry {
private String name;
private ArrayList<Entry> dir = new ArrayList<Entry>();
public Directory(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Entry add(Entry entry) {
dir.add(entry);
return this;
}
public Iterator<Entry> iterator() {
return dir.iterator();
}
public void accept(Visitor v) {
v.visit(this);
}
}
Une classe abstraite qui représente un visiteur d'un fichier ou d'un répertoire.
Visitor.java
public abstract class Visitor {
public abstract void visit(File file);
public abstract void visit(Directory directory);
}
Une classe qui affiche une liste de fichiers et de répertoires.
ListVisitor.java
import java.util.Iterator;
public class ListVisitor extends Visitor {
//Nom du répertoire actuellement intéressant
private String currentdir = "";
//Appelé lors de la visite d'un fichier
public void visit(File file) {
System.out.println(currentdir + "/" + file);
}
//Appelé lors de la visite d'un annuaire
public void visit(Directory directory) {
System.out.println(currentdir + "/" + directory);
String savedir = currentdir;
currentdir = currentdir + "/" + directory.getName();
Iterator<Entry> it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
entry.accept(this);
}
currentdir = savedir;
}
}
Cette classe effectue le traitement principal.
Main.java
public class Main {
public static void main(String[] args) {
Directory workspaceDir = new Directory("workspace");
Directory compositeDir = new Directory("Visitor");
Directory testDir1 = new Directory("test1");
Directory testDir2 = new Directory("test2");
workspaceDir.add(compositeDir);
workspaceDir.add(testDir1);
workspaceDir.add(testDir2);
File element = new File("Element.java");
File entity = new File("Entity.java");
File file = new File("file.java");
File directory = new File("Directory.java");
File visitor = new File("Visitor.java");
File listVisitor = new File("ListVisitor.java");
File main = new File("main.java");
compositeDir.add(element);
compositeDir.add(entity);
compositeDir.add(file);
compositeDir.add(directory);
compositeDir.add(visitor);
compositeDir.add(listVisitor);
compositeDir.add(main);
workspaceDir.accept(new ListVisitor());
}
}
/workspace
/workspace/Visitor
/workspace/Visitor/Element.java
/workspace/Visitor/Entity.java
/workspace/Visitor/file.java
/workspace/Visitor/Directory.java
/workspace/Visitor/Visitor.java
/workspace/Visitor/ListVisitor.java
/workspace/Visitor/main.java
/workspace/test1
/workspace/test2
Le modèle Visiteur ne fait que compliquer le processus, et je pense que "s'il est nécessaire de répéter le processus, pourquoi ne pas écrire le processus en boucle dans la structure de données?" L'objectif du modèle Visiteur est ** de séparer la structure des données et le traitement **. La structure de données organise les éléments comme un ensemble et connecte les éléments. Préserver cette structure est une chose, et écrire un processus basé sur cette structure en est une autre. Le rôle Visiteur (List Visitor) peut être développé indépendamment du rôle Acceptor (File, Directory). En d'autres termes, le modèle Visiteur augmente l'indépendance de la classe d'accepteur (Fichier, Répertoire) en tant que ** partie **. Si le contenu du processus est implémenté en tant que méthode de la classe File ou Directory, la classe File ou Directory devra être modifiée chaque fois qu'un nouveau processus est ajouté et la fonction est étendue.
Cet article et exemple de programme ont été créés à partir des livres suivants.
C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.
Recommended Posts