【デザインパターン】Iteratorパターン

同じようなオブジェクトを整列させて管理したいときに使用します。

イメージとしてはLISTに近い。

package org.example.iterator;

public interface Iterator {
    public Object next();
    public boolean hasNext();
}
package org.example.iterator;

public interface Aggregate {
    public Iterator iterator();
}
package org.example.iterator;

public class ConcreteAggregate implements Aggregate{
    private Object[] objects;
    private int last = 0;

    public ConcreteAggregate(int maxSize)
    {
        this.objects = new Object[maxSize];
    }

    public void add(Object object)
    {
        objects[last] = object;
        last++;
    }

    public Object getItem(int index)
    {
        return objects[index];
    }

    public int getLast()
    {
        return last;
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }
}
package org.example.iterator;

public class ConcreteIterator implements Iterator {
    private ConcreteAggregate aggregate;
    private int index;

    public ConcreteIterator(ConcreteAggregate aggregate)
    {
        this.aggregate = aggregate;
        this.index = 0;
    }

    @Override
    public Object next() {
        Object object = aggregate.getItem(index);
        index++;
        return object;
    }

    @Override
    public boolean hasNext() {
        if(index < aggregate.getLast())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
package org.example.iterator;

public class Item {
}
package org.example.iterator;

public class Main {
    public static void main(String[] args)
    {
        ConcreteAggregate aggregate = new ConcreteAggregate(10);
        aggregate.add(new Item());
        aggregate.add(new Item());
        aggregate.add(new Item());

        Iterator iterator = aggregate.iterator();
        while(iterator.hasNext())
        {
            Item item = (Item)iterator.next();
        }
    }
}

まぁ、こんなコード書かなくても、すでにIteratorクラスは実装されているので。

Listのオブジェクトからiterator()で取得することもできます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください