[JAVA] Modèle de conception ~ Visiteur ~

1.Tout d'abord

Voici un résumé du ** modèle de visiteur ** dans le modèle de conception du GoF.

2. Quel est le modèle de visiteur?

3. Exemple de diagramme de classes

Visitor.PNG

4. Exemple de programme

Un programme qui affiche une liste de répertoires et de fichiers.

4-1. Interface des éléments

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);
}

4-2. Classe d'entrée

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();
	}
}

4-3. Classe de fichier

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);
	}
}

4-4. Classe d'annuaire

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);
	}
}

4-5. Classe de visiteur

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);
}

4-6. Classe ListVisitor

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;
	}
}

4-7. Classe principale

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());
	}
}

4-8. Résultat de l'exécution

/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

5. Avantages

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.

  1. GitHub

7. Liste des modèles de conception

8. Référence

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

Modèle de conception ~ Visiteur ~
Modèle de visiteur
Modèle de visiteur
Modèle de conception ~ Constructeur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Méthode d'usine ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de prototype
Motif de souvenir
Modèle d'itérateur
Modèle d'observateur
Modèle de constructeur
Modèle de pont
Dispatcher Pattern (un nouveau modèle de conception qui résout le problème d'expression du modèle de visiteur)
Modèle de commande
Modèle de constructeur
Modèle de stratégie
Modèle d'itérateur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Modèle de médiateur
Motif de façade
Modèle de pont