Structure et traitement des données séparés. Préparez une classe qui représente les visiteurs qui parcourent la structure de données et laissez cette classe gérer le traitement. Le côté structure de données acceptera les visiteurs.
On dit que le rôle Visiteur a "visité xxx" pour chaque élément spécifique de la structure de données (rôle Élément concret). Déclarez la méthode de visite (xxx). visit (xxx) est une méthode de traitement de xxx, et le code réel est écrit sur le côté du rôle Visite concrète.
package visitor;
public abstract class Visitor {
public abstract void visit(File file);
public abstract void visit(Directory directory);
}
Le rôle Visiteur concret implémente l'interface du rôle Visiteur. Implémentez une méthode sous forme de visite (xxx) et décrivez le traitement pour chaque rôle ConcreteElement.
package visitor;
import java.util.Iterator;
public class ListVisitor extends Visitor{
private String currentDir = "";
@Override
public void visit(File file) {
System.out.println(currentDir + "/" + file);
}
public void visit(Directory directory) {
System.out.println(currentDir + "/" + directory);
String savedDir = currentDir;
currentDir = currentDir + "/" + directory.getName();
Iterator<Entry> it = directory.iterator();
while (it.hasNext()) {
Entry entry = it.next();
entry.accept(this);
}
currentDir = savedDir;
}
}
Le rôle d'Element est un rôle qui représente la destination du rôle de Visiteur. Déclarez une méthode d'acceptation qui accepte les visiteurs. Le rôle de Visiteur est passé à l'argument de la méthode accept.
package visitor;
public interface Element {
public abstract void accept(Visitor v);
}
Le rôle ConcreteElement est le rôle qui implémente l'interface du rôle Element.
package visitor;
public class File extends Entry{
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
public String getName() {
return name;
}
public int getSize() {
return size;
}
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
package visitor;
import java.util.ArrayList;
import java.util.Iterator;
public class Directory extends Entry{
private String name;
private ArrayList<Entry> directory = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
int size = 0;
Iterator<Entry> it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
size += entry.getSize();
}
return size;
}
public Entry add(Entry entry) {
directory.add(entry);
return this;
}
public Iterator<Entry> iterator() {
return directory.iterator();
}
public void accept(Visitor v) {
v.visit(this);
}
}
Le rôle Structure d'objet est un rôle qui gère un ensemble de rôles d'élément. Il a une méthode qui permet au rôle ConcreteVisitor de gérer des rôles d'élément individuels. Ce rôle correspond à la classe Directory ci-dessus.
package visitor;
public class Main {
public static void main(String[] args) {
try {
System.out.println("Making root entries...");
Directory rootDir = new Directory("root");
Directory binDir = new Directory("bin");
Directory tmpDir = new Directory("tmp");
Directory usrDir = new Directory("usr");
rootDir.add(binDir);
rootDir.add(tmpDir);
rootDir.add(usrDir);
binDir.add(new File("vi", 10000));
binDir.add(new File("latex", 20000));
rootDir.accept(new ListVisitor());
System.out.println();
System.out.println("Making user entryies...");
Directory yuki = new Directory("yuki");
Directory hanako = new Directory("hanako");
Directory tomura = new Directory("tomura");
usrDir.add(yuki);
usrDir.add(hanako);
usrDir.add(tomura);
yuki.add(new File("diary.html", 100));
yuki.add(new File("Composite.java", 200));
hanako.add(new File("memo.tex", 300));
tomura.add(new File("game.doc", 400));
tomura.add(new File("junk.mail", 500));
rootDir.accept(new ListVisitor());
} catch (FileThreatmentException e) {
e.printStackTrace();
}
}
}
https://github.com/aki0207/visitor
Je l'ai utilisé comme référence. Édition révisée augmentée Introduction aux modèles de conception appris en langage Java
Recommended Posts