デザインパターン - Iterator
【Iteratorパターンとは】
集合体を決められたAPIで順次走査を行う場合に使用する。
【Iteratorパターンのクラス図】
【Iteratorパターンのメリット】
1.集約オブジェクト(Cart.javaのitemList)を意識せずに決められてAPI(Iterator.java)で内部を走査できる。
2.走査方法を外部クラスに委譲することで、複数のIterator種類がつくれる。
順次走査、逆走査、順次&逆方法など
【サンプル】
Aggregate.java |
Iterator.java |
Cart.java |
package iterator;
import iterator.framework.Aggregate;
import java.util.List;
public class Cart implements Aggregate{
/** item list in cart */
List<Item> itemList = new ArrayList<Item>();
@Override
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 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 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)));
// iterator
while(iterator.hasNext()){
Item item = (Item)iterator.next();
item.showInfo();
}
}
}
|
テスト結果 |
商品名 : 商品1 値段 : 100
商品名 : 商品2 値段 : 200
商品名 : 商品3 値段 : 300
商品名 : 商品4 値段 : 400
商品名 : 商品5 値段 : 500
|