Hier ist eine Zusammenfassung des ** Besuchermusters ** im GoF-Entwurfsmuster.
Ein Programm, das eine Liste von Verzeichnissen und Dateien anzeigt.
Eine Schnittstelle, die eine Datenstruktur darstellt, die Instanzen der Visitor-Klasse akzeptiert.
Element.java
public interface Element {
public abstract void accept(Visitor v);
}
Dies ist die Basisklasse für Datei und Verzeichnis. Implementieren Sie die Element-Schnittstelle.
Entry.java
public abstract class Entry implements Element {
public abstract String getName();
public String toString() {
return getName();
}
}
Eine Klasse, die eine Datei darstellt. Es wird ein Gastgeber für Besucher sein.
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);
}
}
Eine Klasse, die ein Verzeichnis darstellt. Es wird ein Gastgeber für Besucher sein.
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);
}
}
Eine abstrakte Klasse, die einen Besucher einer Datei oder eines Verzeichnisses darstellt.
Visitor.java
public abstract class Visitor {
public abstract void visit(File file);
public abstract void visit(Directory directory);
}
Eine Klasse, die eine Liste von Dateien und Verzeichnissen anzeigt.
ListVisitor.java
import java.util.Iterator;
public class ListVisitor extends Visitor {
//Derzeit interessierender Verzeichnisname
private String currentdir = "";
//Wird beim Besuch einer Datei aufgerufen
public void visit(File file) {
System.out.println(currentdir + "/" + file);
}
//Wird beim Besuch eines Verzeichnisses aufgerufen
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;
}
}
Diese Klasse führt die Hauptverarbeitung durch.
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
Das Besuchermuster erschwert nur die Verarbeitung, und ich habe das Gefühl, dass "Wenn die Verarbeitung wiederholt werden muss, warum nicht die Schleifenverarbeitung in die Datenstruktur schreiben?" Der Zweck des Besuchermusters besteht darin, Datenstruktur und Verarbeitung zu trennen. Die Datenstruktur organisiert die Elemente als Menge und verbindet die Elemente. Diese Struktur zu erhalten ist eine Sache, und einen Prozess zu schreiben, der auf dieser Struktur basiert, ist eine andere. Die Besucherrolle (Besucher auflisten) kann unabhängig von der Akzeptorrolle (Datei, Verzeichnis) entwickelt werden. Mit anderen Worten, das Besuchermuster erhöht die Unabhängigkeit der Akzeptorklasse (Datei, Verzeichnis) als ** Teil **. Wenn der Inhalt des Prozesses als Methode der Klasse "File" oder "Directory" implementiert ist, muss die Klasse "File" oder "Directory" jedes Mal geändert werden, wenn ein neuer Prozess hinzugefügt und die Funktion erweitert wird.
Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.
Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen zu den Entwurfsmustern und Beispielprogrammen sind geschrieben. Schauen Sie sich also auch die Bücher an.
Recommended Posts