[JAVA] Entwurfsmuster ~ Besucher ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Besuchermusters ** im GoF-Entwurfsmuster.

2. Wie ist das Besuchermuster?

3. Beispielklassendiagramm

Visitor.PNG

4. Beispielprogramm

Ein Programm, das eine Liste von Verzeichnissen und Dateien anzeigt.

4-1. Elementschnittstelle

Eine Schnittstelle, die eine Datenstruktur darstellt, die Instanzen der Visitor-Klasse akzeptiert.

Element.java


public interface Element {
	public abstract void accept(Visitor v);
}

4-2. Einstiegsklasse

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

4-3. Dateiklasse

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

4-4. Verzeichnisklasse

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

4-5 Besucherklasse

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

4-6. ListVisitor-Klasse

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

4-7 Hauptklasse

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

4-8 Ausführungsergebnis

/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. Vorteile

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.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

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

Entwurfsmuster ~ Besucher ~
Besuchermuster
Besuchermuster
Entwurfsmuster ~ Builder ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Erinnerungsmuster
Iteratormuster
Beobachtermuster
Builder-Muster
Brückenmuster
Dispatcher-Muster (ein neues Entwurfsmuster, das das Ausdrucksproblem des Besuchermusters löst)
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Brückenmuster