[JAVA] Besuchermuster

Was ist das Besuchermuster?

Separate Datenstruktur und Verarbeitung. Bereiten Sie eine Klasse vor, die die Besucher darstellt, die die Datenstruktur durchstreifen, und lassen Sie diese Klasse die Verarbeitung übernehmen. Die Datenstrukturseite akzeptiert Besucher.

Die Rolle eines Besuchers

Die Besucherrolle soll für jedes spezifische Element der Datenstruktur "xxx besucht" haben (Rolle "Konkretes Element"). Deklarieren Sie die Methode visit (xxx). visit (xxx) ist eine Methode zur Verarbeitung von xxx, und der eigentliche Code wird auf der Seite der Rolle Concrete Visit geschrieben.

package visitor;

public abstract class Visitor {
	public abstract void visit(File file);
	public abstract void visit(Directory directory);
}

Die Rolle des konkreten Besuchers

Die Rolle "Konkreter Besucher" implementiert die Schnittstelle "Besucherrolle". Implementieren Sie eine Methode in Form eines Besuchs (xxx) und beschreiben Sie die Verarbeitung für jede ConcreteElement-Rolle.

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

Die Rolle des Elements

Die Rolle des Elements ist eine Rolle, die das Ziel der Rolle des Besuchers darstellt. Deklarieren Sie eine Akzeptanzmethode, die Besucher akzeptiert. Die Rolle des Besuchers wird an das Argument der Methode accept übergeben.

package visitor;

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

Die Rolle des Betonelements

Die ConcreteElement-Rolle ist die Rolle, die die Schnittstelle der Element-Rolle implementiert.

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

Die Rolle der Objektstruktur

Die Objektstrukturrolle ist eine Rolle, die eine Reihe von Elementrollen verarbeitet. Es verfügt über eine Methode, mit der die ConcreteVisitor-Rolle einzelne Elementrollen verarbeiten kann. Diese Rolle entspricht der obigen Directory-Klasse.

Anrufer

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

Ausführungsergebnis

スクリーンショット 2020-09-16 18.12.57.png

https://github.com/aki0207/visitor

Ich habe dies als Referenz verwendet. Erweiterte überarbeitete Ausgabe Einführung in in Java gelernte Entwurfsmuster

Recommended Posts

Besuchermuster
Besuchermuster
Entwurfsmuster ~ Besucher ~
Erinnerungsmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Strategiemuster
Iteratormuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Brückenmuster
abstraktes Fabrikmuster
Entwurfsmuster ~ Builder ~
[Java] Strategiemuster
Java-Entwurfsmuster
Java-Rückrufmuster
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
[Java] Singleton-Muster
Entwurfsmuster ~ Befehl ~
Abstraktes Fabrikmuster
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Muster der Vorlagenmethode
Entwurfsmuster ~ Dekorateur ~
Muster der Vorlagenmethode
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
[Java] Adaptermuster
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Java-Muster-Memo