标签:创建 last sdn avr http mail views 需要 parent
标签 : Java与设计模式
迭代器模式: 提供一种方法顺序访问聚合对象(如
List、Set)内的每个元素, 而又不暴露聚合对象的内部实现.
![]()
(图片来源: 设计模式: 可复用面向对象软件的基础)

由于Java已内置了java.lang.Iterable和java.util.Iterator接口, 而Iterable可以作为Aggregate存在(Abstract), 因此在Java中实现迭代器便可不用再定义这两个接口.
Iterable接口, 返回ConcreteIterator的一个适当的实例;Iterator接口(最好作为具体聚集的内部类), 对该聚集遍历时跟踪当前位置./**
 * @author jifang
 * @since 15/12/15 下午8:33.
 */
public class ConcreteAggregate implements Iterable<String> {
    private List<String> list;
    public ConcreteAggregate() {
        this.list = new ArrayList<>();
    }
    public void add(String item) {
        list.add(item);
    }
    public String get(int index) {
        return list.get(index);
    }
    @Override
    public Iterator<String> iterator() {
        return new ConcreteIterator();
    }
    /**
     * 具体迭代器实现类
     */
    private class ConcreteIterator implements Iterator<String> {
        // 游标
        int cursor = 0;
        // 比游标慢一个元素
        int lastRet = -1;
        @Override
        public boolean hasNext() {
            return cursor != list.size();
        }
        @Override
        public String next() {
            if (cursor >= list.size())
                throw new NoSuchElementException();
            ++cursor;
            return list.get((lastRet = cursor - 1));
        }
        @Override
        public void remove() {
            list.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
        }
    }
}
public class Client {
    @Test
    public void client(){
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("aa");
        aggregate.add("bb");
        aggregate.add("remove");
        aggregate.add("cc");
        aggregate.add("dd");
        aggregate.add("remove");
        aggregate.add("ee");
        Iterator<String> iter = aggregate.iterator();
        while (iter.hasNext()){
            String item = iter.next();
            System.out.println(item);
            if (item.equals("remove")){
                iter.remove();
            }
        }
        System.out.println("********----------********");
        for (String item : aggregate){
            System.out.println(item);
        }
    }
}
适用
Iterator使用场景不必多言, 由于Java已经将其固化到语言中,因此开发中天天都在使用:
标签:创建 last sdn avr http mail views 需要 parent
原文地址:http://blog.csdn.net/zjf280441589/article/details/56669806