java-設計模式-迭代器模式

設計模式-迭代器模式
    提供一種方法順序訪問一個聚合對象中各個元素,而有不暴露該對象的內部表示
    本質:控制訪問聚合對象的元素,透明訪問元素

這個模式其實我們很熟悉了,因爲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'}

 

可以看到使用方法還是一樣,都是很簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章