Java-Entwurfsmuster (design patterns): Iterator

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der Verhaltensmuster (Behavioral Patterns) – Iterator. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation (interaction) zwischen Objekten und ihrer Verantwortung (responsibility).

Was ist das Entwurfsmuster Iterator?

Iterator in der objektorientierten Programmierung bietet eine Möglichkeit, systematisch auf die Elemente eines in einem Container gespeicherten Objekts zuzugreifen und sie zu durchlaufen, ohne seine interne Darstellung zu kennen. Es trennt auch die auf die Elemente anwendbaren Algorithmen vom Container.

Was für ein Problem löst das Entwurfsmuster Iterator?

Es löst das Problem des effizienten Zugriffs auf Elemente in einer Sammlung und verbirgt gleichzeitig die Struktur dieser Sammlung. Sein Hauptziel ist es, eine einheitliche Methode zum Durchlaufen verschiedener Arten von Sammlungen bereitzustellen, ohne dass deren interne Struktur bekannt sein muss. Dieses Muster definiert ein Iterator-Interface, das standardmäßig Methoden wie next(), hasNext() usw. enthält. Konkrete Implementierungen dieses Interfaces werden von Klassen bereitgestellt, die Sammlungen wie Listen, Mengen, Arrays und Ähnliches implementieren.

Beispiel einer Iterator-Implementierung in Java

Wir werden ein Programm zum Hinzufügen von Notizen erstellen und das Iterator-Designmuster verwenden, um zu zeigen, wie wir einfach darauf zugreifen und durch sie navigieren können. Wir werden das Interface als Template erstellen, damit es für jeden Datentyp verwendet werden kann. Iterator.java

package designpatterns;

// Rozhranie pre iterator
public interface Iterator<T> {
    boolean hasNext();
    T next();
}

Das Interface Iterator definiert die Methoden hasNext() und next(). Die erste Methode sollte prüfen, ob ein weiteres Element vorhanden ist, und die zweite Methode sollte das nächste Element zurückgeben. ListIterator.java

package designpatterns;

import java.util.List;

// Konkretny iterator pre zoznam (List)
public class ListIterator<T> implements Iterator<T> {
    private List<T> zoznam;
    private int pozicia;

    public ListIterator(List<T> zoznam) {
        this.zoznam = zoznam;
        this.pozicia = 0;
    }

    @Override
    public boolean hasNext() {
        return pozicia < zoznam.size();
    }

    @Override
    public T next() {
        if(this.hasNext())
            return zoznam.get(pozicia++);
        return null;
    }
}

ListIterator implementiert das Interface Iterator und bietet eine konkrete Implementierung für eine Liste (List). Sie behält eine Referenz auf die Liste (List<T > und verfolgt die aktuelle Position für die Iteration. Die Methode hasNext() überprüft, ob es einen weiteren Element in der Liste gibt. Die Methode next() gibt das nächste Element in der Liste zurück und verschiebt die Position auf das nächste Element. Notizen.java

package designpatterns;

import java.util.ArrayList;
import java.util.List;

public class Poznamky<T> {
    private List<T> poznamky;
    public Poznamky() {
        this.poznamky = new ArrayList<>();
    }

    public void pridajPoznamku(T poznamka) {
        poznamky.add(poznamka);
    }

    public Iterator<T> iterator() {
        return new ListIterator<>(poznamky);
    }
}

Die Klasse Notes speichert eine Liste von Notizen (in diesem Fall vom Typ T). Die Methode pridajPoznamku() fügt eine neue Notiz der Liste hinzu. Die Methode iterator() erstellt eine ListIterator-Instanz und gibt diese zurück, um über die Noten in der Liste zu iterieren. Main.java

import designpatterns.Iterator;
import designpatterns.Poznamky;

public class Main {
    public static void main(String[] args) {
        Poznamky<String> poznamky = new Poznamky<>();
        poznamky.pridajPoznamku("Zajtra bude snežiť.");
        poznamky.pridajPoznamku("Čoskoro budú Vianoce.");
        poznamky.pridajPoznamku("Treba nakúpiť darčeky.");
        // Pouzitie iteratora na prechadzanie cez pridane poznamky
        Iterator<String> iterator = poznamky.iterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

Main ist eine Client-Klasse, die die Verwendung dieses Entwurfsmusters demonstriert. Sie erstellt eine Instanz der Klasse Poznamky mit dem konkreten Typ String, fügt einige Notizen hinzu und durchläuft sie dann mit einem Iterator, um sie auszugeben. Die Ausgabe dieses Beispiels ist: Main ist eine Client-Klasse, die die Verwendung dieses Entwurfsmusters demonstriert und eine Notes-Instanz eines bestimmten String-Typs erzeugt.

Zusammenfassung

Das Entwurfsmuster Iterator wird standardmäßig verwendet, um eine Gruppe von Objekten in einer Datenstruktur zu durchlaufen, unabhängig vom spezifischen Objekttyp. Dieses Muster ist so häufig verwendet worden, dass es in Programmiersprachen bereits vordefinierte Klassen gibt. Iterator muss nicht nur auf das nächste Objekt zugreifen, sondern kann auch so implementiert werden, dass er zum Beispiel in einer Baumstruktur Breiten- oder Tiefendurchläufe durchführt. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Code Java Iterator hier herunter. Wenn du als Java-Programmierer auf der Suche nach Arbeit bist, schau dir unsere Mitarbeiterbenefits an und reagiere auf unsere aktuellen Stellenangebote.

 

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich