Software-Entwurfsmuster

Filteriterator-Implementierung

Der Filteriterator ist nach dem Bridge-Entwurfsmuster gebildet. Er benötigt ein Behavior, das den Basisiterator und die Filterfunktion angibt. Ein solches konkretes Behavior wird von der abstrakten Klasse FilterIteratorBehavior abgeleitet; diese enthält auch gleich die Factory-Methode iterator, um den so gebildeten Filteriterator zu erzeugen.

Die hier angegebene Version verwendet Typ-Parameter.

Abstrakte Klasse FilterIteratorBehavior

Ein Behavior, das einen Filteriterator erzeugt, wird von der abstrakten Klasse FilterIteratorBehavior abgeleitet. So ist sichergestellt, dass ein Basisiterator und eine Filterfunktion vorhanden sind; außerdem steht die Factory-Methode iterator zur Verfügung.

public abstract class FilterIteratorBehavior<Typeimplements Iterable<Type>
{
    // the base iterator
    public abstract Iterator<Type> baseIterator();

    // the filter function
    public abstract boolean pass(Type x);

    // factory method that creates the filter iterator
    public Iterator<Type> iterator()
    {
        return new FilterIterator<Type>(this);
    }

}

Klasse FilterIterator

Eine gewisse Schwierigkeit bei der Implementierung eines Filteriterators entsteht dadurch, dass immer erst gesucht werden muss, ob noch ein Element vorhanden ist, das der Filterbedingung genügt. Dies wird mit der Methode tryGetNext durchgeführt.

public class FilterIterator<Typeimplements Iterator<Type>
{
    private FilterIteratorBehavior<Type> behavior;
    private boolean hasnext;
    private Iterator<Type> it;
    private Type x;

    public FilterIterator(FilterIteratorBehavior<Type> behavior)
    {
        this.behavior=behavior;
        hasnext=true;
        it=behavior.baseIterator();
        x=tryGetNext();
    }

    @Override
    public boolean hasNext()
    {
        return hasnext;
    }

    @Override
    public Type next()
    {
        Type y=x;
        x=tryGetNext();
        return y;
    }

    // finds the next object that passes the filter
    private Type tryGetNext()
    {
        Type y;
        while (it.hasNext())
        {
            y=it.next();
            if (behavior.pass(y))
                return y;
        }
        hasnext=false;
        return null;
    }

}

 

 

Weiter mit:  [Anwendung eines Filteriterators]   oder   [up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 05.02.2008   Updated: 18.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden