Iterateur sur Composite


public abstract class Forme implements Iterable<Forme> {

    private static void operation( Forme f ) {
        System.out.println("Je suis : " + f);
    }

    @Override
    public abstract Iterator<Forme> iterator();
}



public class FormeComplexe extends Forme {
    private Forme[] _composants = new Forme[2];

    public FormeComplexe( Forme forme1, Forme forme2 ) {
        _composants[0] = forme1;
        _composants[1] = forme2;
    }

    @Override
    public Iterator<Forme> iterator() {
        return new IterateurComplexe(this);
    }

    public static class IterateurComplexe implements Iterator<Forme> {
        private FormeComplexe _relatedItem;
        private Iterator<Forme> _iterator1;
        private Iterator<Forme> _iterator2;

        public IterateurComplexe( FormeComplexe item ) {
            _relatedItem = item;
            _iterator1 = _relatedItem._composants[0].iterator();
            _iterator2 = _relatedItem._composants[1].iterator();
        }

        @Override
        public boolean hasNext() {
            return _iterator1.hasNext() || _iterator2.hasNext();
        }

        @Override
        public Forme next() {
            if (_iterator1.hasNext()) {
                return _iterator1.next();
            } else if (_iterator2.hasNext()) {
                return _iterator2.next();
            } else {
                throw new NoSuchElementException();
            }
        }
    }
}

public class Et extends FormeComplexe {
   public Et( Forme forme1, Forme forme2 ) {
      super(forme1, forme2);
}

public class Cube extends Forme {
    private int _index;

    public Cube( int index ) {
        _index = index;
    }

    @Override
    public String toString() {
        return "Cube n°" + _index;
    }

    @Override
    public Iterator<Forme> iterator() {
        return new IterateurSimple(this);
    }

    public static class IterateurSimple implements Iterator<Forme> {
        private boolean _next = true;
        private Forme _relatedItem;

        public IterateurSimple( Forme forme ) {
            _relatedItem = forme;
        }

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

        @Override
        public Forme next() {
            _next = false;
            return _relatedItem;
        }
    }
}

public static void main( String[] args ) {
    Forme maForme = new Intersection (new Cube(0), new Intersection(new Cube(1), new Cube(2)));
    Iterator<Forme> iterator = maForme.iterator();

    while (iterator.hasNext()) {
        Forme f = iterator.next();
        operation(f);
    }

// ou plus classiquement
    for ( Forme f : formes ) {
        operation(f);
    }
}

Last modified: Tuesday, 1 October 2019, 7:38 PM