liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - Iterator

Iteratorパターンとは】

集合体を決められたAPIで順次走査を行う場合に使用する。

 

Iteratorパターンのクラス図】

 

Iteratorパターンのメリット】

1.集約オブジェクト(Cart.javaのitemList)を意識せずに決められてAPIIterator.java)で内部を走査できる。

2.走査方法を外部クラスに委譲することで、複数Iterator種類がつくれる。

  順次走査、逆走査、順次&逆方法など

  

【サンプル】

Aggregate.java
package iterator.framework;
// 「私が持っている要素を準じにスキャンしてくれる人」をつくるAPIをきめる
public interface Aggregate {
public Iterator iterator();
}

 

Iterator.java
package iterator.framework;
// 要素を順次にスキャンしていくAPIを決める
public interface Iterator {
public boolean hasNext();
public Object next();
}

 

Cart.java
package iterator;
 
import iterator.framework.Aggregate;
import iterator.framework.Iterator;
 
import java.util.ArrayList;
import java.util.List;
// カートクラス(複数のアイテムを格納する) かつ 要素を数える人を作るAPIを持っている。
public class Cart implements Aggregate{
/** item list in cart */
List<Item> itemList = new ArrayList<Item>();
 
@Override
public Iterator iterator() {
return new ItemIterator(itemList);
}
 
public void addItem(Item item) {
this.itemList.add(item);
}
 
public void removeItem(Item item) {
this.itemList.remove(item);
}
}

 

Item.java
package iterator;
 
import java.math.BigDecimal;
// アイテムクラス、名称と値段のプロパティを持つ
public class Item {
 
/** item name */
private String name;
/** item value */
private BigDecimal value;
 
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public Item(String name, BigDecimal value) {
this.name = name;
this.value = value;
}
/**
* show item info.
*/
public void showInfo() {
System.out.println("商品名 : " + this.name + "  値段 : " + this.value);
}
}

 

ItemIteratore.java
package iterator;
 
import iterator.framework.Iterator;
 
import java.util.List;
// 要素を走査するAPIを実装
public class ItemIterator implements Iterator{
 
private List<Item> itemList;
private int index;
 
public ItemIterator(List<Item> itemList) {
this.itemList = itemList;
index = 0;
}
@Override
public boolean hasNext() {
return index < itemList.size();
}
 
@Override
public Item next() {
return itemList.get(index++);
}
}
 
IteratorPatternTest .java
package iterator;
 
import iterator.framework.Iterator;
import java.math.BigDecimal;
// テストクラス
public class IteratorPatternTest {
 
public static void main(String[] args) {
Cart cart = new Cart();
cart.addItem(new Item("商品1", new BigDecimal(100)));
cart.addItem(new Item("商品2", new BigDecimal(200)));
cart.addItem(new Item("商品3", new BigDecimal(300)));
cart.addItem(new Item("商品4", new BigDecimal(400)));
cart.addItem(new Item("商品5", new BigDecimal(500)));
 
while(iterator.hasNext()){
Item item = (Item)iterator.next();
 
item.showInfo();
}
}
}
 
テスト結果
商品名 : 商品1  値段 : 100
商品名 : 商品2  値段 : 200
商品名 : 商品3  値段 : 300
商品名 : 商品4  値段 : 400
商品名 : 商品5  値段 : 500