Item.java
メンバ変数 num を持つ Item を定義します。
class Item {
private int num;
public Item(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
ConcreteIterator.java、Iterator.java
後に定義する Aggregate から値を取り出す Iterator を定義します。
class ConcreteIterator implements Iterator {
private ConcreteAggregate concreteAggregate;
private int idx;
public ConcreteIterator(ConcreteAggregate concreteAggregate) {
this.concreteAggregate = concreteAggregate;
this.idx = 0;
}
public boolean hasNext() {
return (idx < concreteAggregate.getSize()) ? true : false;
}
public Object next() {
return concreteAggregate.getItemAt(idx++);
}
}
interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
ConcreteAggregate.java、Aggregate.java
複数の Item を持つクラスを Aggregate として定義します。自身を走査するための Iterator も返せるようにします。
class ConcreteAggregate implements Aggregate {
private Item[] items;
private int size = 0;
public ConcreteAggregate(int maxSize) {
this.items = new Item[maxSize];
}
public void append(Item item) {
this.items[size++] = item;
}
public Item getItemAt(int idx) {
return items[idx];
}
public int getSize() {
return size;
}
public Iterator iterator() {
return new ConcreteIterator(this);
}
}
interface Aggregate {
public abstract Iterator iterator();
}
Main.java
Main から、ループ処理の実装を別のクラスに切り出すことができました。
Aggregateの実装を配列からベクターに変更した場合、Mainの改修は必要ありません。Iteratorの実装として、逆方向に走査可能なものを追加する、といった拡張も容易です。
class Main {
public static void main(String[] args) {
int n = 5;
ConcreteAggregate concreteAggregate = new ConcreteAggregate(n);
for(int i=0; i<n; ++i) concreteAggregate.append(new Item(i));
Iterator it = concreteAggregate.iterator();
while(it.hasNext()) {
Item item = (Item)it.next();
System.out.println(item.getNum());
}
}
}
出力
$ javac Main.java Item.java Aggregate.java Iterator.java ConcreteAggregate.java ConcreteIterator.java && java Main
0
1
2
3
4
0
Pythonでデータ解析と自動化ツールを開発しています。DjangoでのWeb開発も得意です!
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。





