[JAVA] Ich habe versucht, das Iterator-Muster zu implementieren

Domo ist Fugito.

Diesmal Hiroshi Yuki "Einführung in in Java gelernte Entwurfsmuster" Entwurfsmuster unter Bezugnahme auf (SB Creative) Wir werden das "Iteratormuster" implementieren, das eines der Ich werde.

Was ist das Iteratormuster?

Das Iterator-Muster ist eine Sammlung vieler Dinge Weisen Sie es manchmal in der richtigen Reihenfolge an und scannen Sie das Ganze Es dient zur Durchführung der Verarbeitung. (P.2)

Zum Beispiel: "Die Identität der Dinge in der Tasche nacheinander Ich denke, es ist ein Programm namens "Suche".

In diesem Buch als Beispielprogramm "In das Bücherregal eingeben Schlagen Sie die Bücher nach und zeigen Sie die Namen der Bücher der Reihe nach an. " Ist vorgestellt. Diesmal habe ich dort ein Arrangement hinzugefügt "** Titel in der Songliste einzeln anzeigen **" Ich dachte, ich würde das Programm im Iterator-Muster schreiben Ich werde.

Aggregierte Schnittstelle

Gesamtzahl der Schnittstellen Stellt ein "Aggregat" von zu erledigenden Aufgaben dar. (P.3)

Hier "Song Aggregate", was für "Sammlung von Songs" steht Erstellen Sie eine Schnittstelle namens.

public interface SongAggregate {
	public abstract SongIterator songIterator();
}

Diese Schnittstelle zählt Aggregate Deklarieren Sie nur die Methode "songIterator" für.

Iterator-Schnittstelle

Iterator-Schnittstelle zählt Elemente Wirkt wie eine Schleifenvariable Es ist eine Sache.

Erstellen Sie hier "Song Iterator".

public interface SongIterator {
	public abstract boolean hasNext();
	public abstract Object next();
}

Hat die hasNext-Methode die folgenden Elemente im "Aggregat"? Es dient zur Überprüfung. Auch die nächste Methode Wenn Sie das folgende Element haben, erhalten Sie dieses Element.

Liedklasse

Dies ist eine Klasse, die jedes "Lied" darstellt.

public class Song {
	private String songName;

	public Song(String s) {
		this.songName = s;
	}

	public String getSongName() {
		return songName;
	}
}

SongList-Klasse

Diese Klasse drückt "eine Sammlung von Liedern" aus. Implementieren Sie die SongAggregate-Schnittstelle mit abstrakten Methoden Überschreiben Sie die dort vorhandene songIterator-Methode.

public class SongList implements SongAggregate {
	private Song[] songs;
	private int last = 0;

	public SongList(int max) {
		this.songs = new Song[max];
	}

	public Song getSongAt(int id) {
		return songs[id];
	}

	public void appendSong(Song s) {
		this.songs[last] = s;
		last++;
	}

	public int getLength() {
		return last;
	}

	@Override
	public SongIterator songIterator() {
		return new SongListIterator(this);
	}

}

Hier wird das Lied vom Konstrukteur maximal genutzt Definieren Sie eine SongList-Instanz, die bis zu speichern kann tun. Die Methode getSongAt gibt das id-te Lied zurück. Die appendSong-Methode befindet sich am Ende der Array-Songs [] Speichert ein neues Lied s. getLength gibt die Anzahl der Songs in der SongList zurück Die Methode. Und in der überschriebenen songIterator-Methode Von der Klasse namens SongListIterator, die wir erstellen werden Erstellen Sie eine Instanz und geben Sie sie als SongIterator-Typ zurück.

SongListIterator-Klasse

Scannen Sie tatsächlich die SongList-Klasse Es ist eine Klasse. Echte SongIterator-Schnittstelle Vorgeben, über der hasNext-Methode und der nächsten Methode zu sein Reiten

public class SongListIterator implements SongIterator {
	private SongList songList;
	private int id;

	public SongListIterator(SongList sl) {
		this.songList = sl;
		this.id = 0;
	}

	@Override
	public boolean hasNext() {
		if(id < songList.getLength()) {
			return true;
		}else {
			return false;
		}
	}

	@Override
	public Object next() {
		Song song = songList.getSongAt(id);
		id++;
		return song;
	}

}

Jetzt können Sie die Liste scannen. von hier Erstellen Sie eine Hauptklasse, um eine aktuelle Liste zu erstellen und zu scannen Ich werde versuchen.

public class Main {
	public static void main(String[] args) {
 //新しくSongListを作成
		SongList songList = new SongList(5);

 //リストに曲を追加
		songList.appendSong(new Song("So What"));
		songList.appendSong(new Song("Freddie Freeloader"));
		songList.appendSong(new Song("Blue In Green"));
		songList.appendSong(new Song("All Blues"));
		songList.appendSong(new Song("Flamenco Sketches"));

 //SongIteratorのインスタンスを生成
		SongIterator song_it = songList.songIterator();

 //曲をひとつずつ調べる
		while(song_it.hasNext()) {
			Song song = (Song)song_it.next();
			System.out.println(song.getSongName());
		}
	}

}

Das Ausführungsergebnis ist wie folgt.

So What
Freddie Freeloader
Blue In Green
All Blues
Flamenco Sketches

Es scheint, dass es richtig ausgeführt wurde. Guter Kummer.

Zusammenfassung

Immerhin ist der Punkt des Iteratormusters "** Auch wenn ich die SongList neu schreibe, funktioniert die songIterator-Methode immer noch. Wenn es existiert und den richtigen SongIterator zurückgibt, die Hauptnachricht Sods while-Schleife funktioniert ohne Änderungen ** " Es ist am Punkt. Kurz gesagt, ein Design, das der Erweiterung von Funktionen standhält Es bedeutet, dass es geworden ist. Es ist nur "die Weisheit des Feldes" Ich fühle mich so.

Ab sofort werden 23 GoF-Entwurfsmuster so verwendet. Ich wünschte, ich könnte es zusammenstellen.

Also, das war's für heute. Es war Fugi.

P.S. "Senioren", Meinungen zu diesem Artikel, Bitte zögern Sie nicht zu kommentieren, wenn Sie Ergänzungen m (_ _) m haben

Recommended Posts

Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, die Methode zu erklären
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, polymorph in Nogizaka zu implementieren.
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe versucht, eine Validierung durchzuführen, um zu vereinheitlichen, wie Hash-Tags geschrieben werden
Ich habe versucht, C # (Indexer) zu kauen.
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe das Java-Framework "Quarkus" ausprobiert.
[Rails] Ich habe versucht, die Anwendung zu löschen
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, Active Hash zu erklären
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Iteratormuster
[Metall] Ich habe versucht, den Fluss bis zum Rendern mit Metall herauszufinden
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Daten sortieren Absteigend, aufsteigend / Schienen
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Iteratormuster