Software-Entwurfsmuster

Compound-Iterator-Implementierung

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

Abstrakte Klasse CompoundIteratorBehavior

Ein Behavior, das einen Compound-Iterator erzeugt, wird von der abstrakten Klasse CompoundIteratorBehavior abgeleitet. So ist sichergestellt, dass ein Basisiterator, ein Subiterator und die Funktion composeItems vorhanden sind; außerdem steht die Factory-Methode iterator zur Verfügung.

 

public abstract class CompoundIteratorBehavior<BaseTypeSubTypeCompoundType>
implements Iterable<CompoundType>
{
    // the base iterator
    public abstract Iterator<BaseType> baseIterator();

    // the subiterator
    // x0 is the cursor object of the base iterator
    public abstract Iterator<SubType> subIterator(BaseType x0);

    // specifies the object composed of the two cursor objects x0 and x1
    public abstract CompoundType composeItems(BaseType x0, SubType x1);

    // factory method that creates the compound iterator
    public Iterator<CompoundType> iterator()
    {
        return new CompoundIterator<BaseTypeSubTypeCompoundType>(this);
    }

}

Compound-Iterator

Es folgt die Implementierung des Compound-Iterators.

public class CompoundIterator<BaseTypeSubTypeCompoundType>
implements Iterator<CompoundType>
{
    private CompoundIteratorBehavior<BaseTypeSubTypeCompoundType> behavior;
    private boolean hasnext;
    private Iterator<BaseType> it0;
    private Iterator<SubType> it1;
    private BaseType x0;
    private CompoundType x01;

    public CompoundIterator(CompoundIteratorBehavior<BaseTypeSubTypeCompoundType> behavior)
    {
        this.behavior=behavior;
        hasnext=true;
        it0=behavior.baseIterator();
        x01=tryNext0();
    }

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

    @Override
    public CompoundType next()
    {
        CompoundType x=x01;
        x01=tryNext1();
        return x;
    }

    // startet ausgehend vom Cursorelement x0 des Basisiterators
    // den Subiterator und liefert ein zusammengesetztes Element
    // zurück. Wenn der Subiterator kein weiteres Element mehr
    // liefert, wird zum nächsten Cursorelement x0 des Basisiterators
    // übergegangen; wenn keines mehr vorhanden ist, wird hasnext 
    // auf false gesetzt
    private CompoundType tryNext0()
    {
        while (it0.hasNext())
        {
            x0=it0.next();
            if (x0!=null)
            {
                it1=behavior.subIterator(x0);
                return tryNext1();
            }
        }
        hasnext=false;
        return null;
    }

    // versucht, das nächste Cursorelement des Subiterators zurückzuliefern;
    // wenn keines mehr vorhanden, wird versucht, zum nächsten Cursorelement
    // des Basisiterators weiterzuschalten und dann den Subiterator neu zu
    // starten
    private CompoundType tryNext1()
    {
        if (it1.hasNext())
            return behavior.composeItems(x0, it1.next());
        else
            return tryNext0();
    }

}

 

 

Weiter mit:  [Anwendung des Compound-Iterators]   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