迭代器模式

使用者不需要关心HashSet内部的实现也不需要关系遍历的规则,那么同时设计者也可以随意的改动遍历规则而不影响使用者的使用。

 

迭代器模式的适用性

  •   访问一个聚合对象而无需暴露它的内部表示。
  •   支持对聚合对象的多种遍历。
  •   为遍历不同的聚合结构提供一个统一的接口(支持迭代器复用)。

 

迭代器模式的结构图

android游标详解 java游标原理_迭代器模式

 

迭代器模式中总共分为4类角色:

1、抽象迭代器角色(Iterator):定义了访问和遍历聚合元素的接口。

2、具体迭代器角色(ConcreteIterator):实现迭代器接口,并且记录遍历中的当前位置。

3、抽象聚合角色(Aggregate):负责提供创建具体迭代器角色的接口。

4、具体聚合角色(ConcreteAggregate):实现创建相应迭代器的接口,该操作返回一个合适的具体迭代器角色。

 

迭代器模式的示例

  抽象聚合角色,负责定义好聚合角色的增加、删除和返回迭代器的方法的接口。

public interface Aggregate {
    public void add(Object object);

    public void remove(Object object);

    public Iterator creteIterator();
}

  具体聚合角色,实现抽象聚合角色定义的接口,同时提供CreateIterator()方法返回遍历该对象的迭代器。

public class ConcreteAggregate implements Aggregate {
    List<Object> list = new ArrayList<>();

    @Override
    public void add(Object object) {
        this.list.add(object);
    }

    @Override
    public void remove(Object object) {
        this.list.remove(object);
    }

    @Override
    public Iterator creteIterator() {
        return new ConcreteIterator(this.list);
    }
}

  抽象迭代器角色,定义遍历聚合对象的next()、hasNext()方法,同时提供能操作聚合对象元素的remove方法。

public interface Iterator {
    public Object next();

    public boolean hasNext();

    public boolean remove();
}

  具体迭代器角色

public class ConcreteIterator implements Iterator {

    private List<Object> list;
    int index = 0;

    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

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

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

    @Override
    public boolean remove() {
        this.list.remove(index);
        return true;
    }
}

  客户端调用

public class Client {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("aaa");
        aggregate.add(123);
        aggregate.add('a');
        Iterator iterator = aggregate.creteIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}


/*
运行结果:
        aaa
        123
        a
*/

 

迭代器模式的优缺点

  1、迭代器模式提供了一个便捷的方式遍历集合中的各元素。

  2、可以通过修改迭代器的实现方式实现正序、倒序等多种开发者想提供的遍历方式。

  3、通过使用迭代器,用户可以只需要拿到迭代器就可以遍历,而不需要关心迭代器是如何实现的。

  4、如果有比较简单的遍历方式,例如数组、List这些,那么尽量使用简单的方式遍历就可以了,因为使用迭代器来遍历对象的效率普遍不是很高。