設計模式-迭代器模式 提供一種方法順序訪問一個聚合對象中各個元素,而有不暴露該對象的內部表示 本質:控制訪問聚合對象的元素,透明訪問元素
這個模式其實我們很熟悉了,因爲java中就有迭代器,而且我們用的也很多。
先上個類圖:
用java List的迭代器解釋下這個類圖吧。
Aggregate 是個聚集的抽象類,對應的是List
ConcreteAggregate具體的聚合類,對應的是 ArrayList
Iterator 迭代抽象類 對應的就是java的 Iterator類
ConcreteIterator 具體迭代類,對應的就是 list.iterator() 獲取的對象對應的類,看源碼得知是ArrayList類裏面的內部類 Itr()
我們先看看怎麼用吧:
System.out.println("java List使用迭代器");
List<String> dataList = new ArrayList<>();
dataList.add("3");
dataList.add("2");
dataList.add("5");
Iterator iterator = dataList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
上述的結果是:
3
2
5
其實到這裏,你已經大概知道迭代器是個什麼東西,迭代器模式也不是很常用。
繼續看看自定義迭代器的用法。
實體類:
public class Item {
private String id;
private String name;
public Item(String id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Item{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
//getter and setter 省略
}
聚合類
就是一個集合,如果這個寫出泛型,那麼會更加通用
/**
* item 聚合類
*/
public class ItemAggregate {
//數據
private List<Item> dataList;
public ItemAggregate(){
dataList = new ArrayList<>();
}
//getter and setter
public List<Item> getDataList() {
return dataList;
}
public void setDataList(List<Item> dataList) {
this.dataList = dataList;
}
}
自定義迭代器類:
import java.util.Iterator;
import java.util.function.Consumer;
public class ItemIterator implements Iterator<Item> {
private ItemAggregate itemAggregate;
private int index = 0;
public ItemIterator( ItemAggregate itemAggregate){
this.itemAggregate = itemAggregate;
}
@Override
public boolean hasNext() {
return itemAggregate.getDataList().size() > index;
}
@Override
public Item next() {
return itemAggregate.getDataList().get(index++);
}
@Override
public void remove() {
itemAggregate.getDataList().remove(index--);
}
@Override
public void forEachRemaining(Consumer<? super Item> action) {
}
}
測試:
System.out.println("自定義迭代器");
ItemAggregate itemAggregate = new ItemAggregate();
itemAggregate.getDataList().add(new Item("1","name1"));
itemAggregate.getDataList().add(new Item("2","name2"));
itemAggregate.getDataList().add(new Item("3","name3"));
ItemIterator itemIterator = new ItemIterator(itemAggregate);
while (itemIterator.hasNext()){
System.out.println(itemIterator.next());
}
測試結果:
Item{id='1', name='name1'}
Item{id='2', name='name2'}
Item{id='3', name='name3'}
可以看到使用方法還是一樣,都是很簡單。