浅谈Java设计模式——迭代器模式(Iterator)

一、概述

        给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

二、使用场景

1.访问一个聚合对象的内容而无需暴露它的内部表示。 

2.支持对聚合对象的多种遍历。 

3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

三、参与者

1.Iterator 迭代器定义访问和遍历元素的接口。 

2.ConcreteIterator 具体迭代器实现迭代器接口。 对该聚合遍历时跟踪当前位置。 

3.Aggregate 聚合定义创建相应迭代器对象的接口。

4.ConcreteAggregate 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.

四、类图

五、代码示例

1.Iterator

/**
 * Iterator
 * @author zhipeng_Tong
 */
public interface Iterator {
    Object next();
    Object first();
    Object last();
    boolean hasNext();
}

2.ConcreteIterator

/**
 * ConcreteIterator
 * @author zhipeng_Tong
 */
public class IteratorImpl implements Iterator {
    private List list;
    private int index;

    public IteratorImpl(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        index++;
        return list.get(index - 1);
    }

    @Override
    public Object first() {
        return list.get(0);
    }

    @Override
    public Object last() {
        return list.get(list.size() - 1);
    }

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

3.Aggregate

/**
 * Aggregate
 * @author zhipeng_Tong
 */
public interface List {
    Iterator iterator();

    Object get(int index);

    int size();

    void add(Object o);
}

4.ConcreteAggregate

/**
 * ConcreteAggregate
 * @author zhipeng_Tong
 */
public class ListImpl implements List {
    private Object[] list;
    private int index;
    private int size;

    public ListImpl() {
        this.list = new Object[100];
        this.index = 0;
        this.size = 0;
    }

    @Override
    public Iterator iterator() {
        return new IteratorImpl(this);
    }

    @Override
    public Object get(int index) {
        return list[index];
    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public void add(Object o) {
        list[index++] = o;
        size++;
    }
}

5.测试代码

public class Client {
    public static void main(String[] args) {
        List list = new ListImpl();
        list.add("hello");
        list.add("word");
        list.add("java");

        Iterator iterator = list.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());

        System.out.println("first: " + iterator.first());
        System.out.println("last: " + iterator.last());

        System.out.println();

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

运行结果

hello
word
java
first: hello
last: java

hello
word
java
原文地址:https://www.cnblogs.com/IdealSpring/p/11871164.html