迭代器模式-Iterator

1、定義

迭代器模式,提供一種方法順序訪問一個聚合對象中的各類元素,而又不暴露該對象的內部表示。java

2、結構

(1)迭代器角色(Iterator):定義遍歷元素所須要的方法,通常來講會有這麼三個方法:ide

  • next():獲取下一個元素的方法
  • hasNext():判斷是否遍歷結束的方法
  • remove():移出當前對象的方法

(2)具體迭代器角色(Concrete Iterator):實現迭代器接口中定義的方法,完成集合的迭代。this

(3)容器角色(Aggregate):  通常是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set接口等spa

(4)具體容器角色(ConcreteAggregate):就是抽象容器的具體實現類,好比List接口的有序列表實現ArrayList,List接口的鏈表實現LinkList,Set接口的哈希列表的實現HashSet等。code

3、例子

抽象的集合對象

/**
 * 抽象的彙集。(能夠理解爲Java中的Collection接口)
 */
public interface Aggregate {

    //返回迭代器
    Iterator iterator();

}

抽象的迭代器blog

/**
 * 抽象的迭代器
 */
public interface Iterator {

    //移動到第一個元素
    void first();

    //是否還有元素
    boolean hasNext();

    //返回下一個元素
    Object next();

}

具體的集合接口

/**
 * 具體的彙集(能夠理解爲Java中的Collection的實現類)
 */
public class ConcreteAggregate implements Aggregate {

    private Object[] list = {"zhangsan", "lisi", "wangwu", "zhaoliu"};

    public Object getElement(int index) {
        if (index < list.length) {
            return list[index];
        }
        //越界
        return null;
    }

    public int size() {
        return list.length;
    }

    /**
     * 由當前具體的彙集返回迭代器
     */
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }
}

具體的迭代器element

/**
 * 具體的迭代器
 */
public class ConcreteIterator implements Iterator {

    private ConcreteAggregate concreteAggregate;
    private int index;
    private int size;

    public ConcreteIterator(ConcreteAggregate concreteAggregate) {
        this.concreteAggregate = concreteAggregate;
        size = concreteAggregate.size();
        index = 0;
    }

    @Override
    public void first() {
        index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < size;
    }

    @Override
    public Object next() {
        return concreteAggregate.getElement(index++);
    }
}

客戶端代碼rem

public class Client {

    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            Object element = iterator.next();
            System.out.println(element);
        }
    }

}

打印結果:
    zhangsan
    lisi
    wangwu
    zhaoliu
相關文章
相關標籤/搜索