设计模式学习笔记十六:迭代器模式

介绍

迭代器设计模式: 迭代器提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

适用性

  • 达到了数据结构与操作的分离
  • 访问一个集合对象而无需暴露它的内部表示
  • 支持对集合对象的多种遍历
  • 为遍历不同的集合结构提供一个统一的接口

UML结构图:

Iterator

场景模拟

集合遍历操作

代码实现

1.定义迭代接口,即Iterator:

public interface Iterator<T> {
    public T first();
    public T next();
    public T current();
    public boolean hasNext();
}

2.实现迭代接口:

public class ConcreteIterator<T> implements Iterator {
    private List<T> list;
    private int cursor = 0;
    @Override
    public T first() {
        return list.get(0);
    }
    public ConcreteIterator(final List<T> list) {
        if (list == null) {
            throw new NullPointerException("list can not be null!");
        }
        this.list = list;
    }

    @Override
    public T next() {
        return hasNext() ? list.get(cursor++) : null;
    }

    @Override
    public T current() {
        return list.get(cursor);
    }

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

3.模拟集合接口Aggregate:

public interface Aggregate<T> {
    public void add(T t);
    public void remove(int index);
    public Iterator<T> iterator();
}

4.模拟集合接口实现,ConcreteAggregate:

public class ConcreteAggregate implements Aggregate<String> {
    private List<String> list;
    public ConcreteAggregate() {
        list = new ArrayList<String>();
    }
    @Override
    public void add(String s) {
        list.add(s);
    }
    @Override
    public void remove(int index) {
        list.remove(index);
    }
    @Override
    public Iterator<String> iterator() {
        return new ConcreteIterator<String>(list);
    }
}

5.调用,即Client:

public class Run {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("a");
        aggregate.add("b");
        aggregate.add("c");
        Iterator<String> iterator = aggregate.iterator();
        System.out.println(iterator.first());
        System.out.println();
        while (iterator.hasNext()) {
            System.out.println(iterator.current());
            System.out.println(iterator.next());
        }
    }
}
原文地址:https://www.cnblogs.com/liushijie/p/4762125.html