迭代器模式

1.定义

迭代器模式是一种设计模式,是一种最简单也最常见的设计模式.它可以让用户通过特定的接口巡访容器中的每一个元素而不用了解底层的实现.

维基百科-迭代器模式

2.实现

迭代器(Iterator)模式

  • 抽象迭代器(Iterator)角色
  • 具体迭代器(Concrete Iterator)角色
  • 聚集(Aggregate)角色
  • 具体聚集(Concrete Aggregate)角色
  • 客户端(Client)角色

抽象迭代器(Iterator)角色: 定义出遍历元素所需的接口

/**
 * 抽象迭代器(Iterator)角色
 */
public interface Iterator {

    Object first();

    Object next();

    boolean hasNext();

    Object currentItem();

}

具体迭代器(Concrete Iterator)角色: 实现了Iterator接口,并保持迭代过程中的游标位置

import java.util.ArrayList;
import java.util.List;

/**
 * 具体迭代器(Concrete Iterator)角色
 */
public class ConcreteIterator implements Iterator {

    private List<Object> list = new ArrayList<Object>();
    private int cursor = 0;

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

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

    @Override
    public Object next() {
        Object obj = null;
        if (this.hasNext()) {
            obj = list.get(cursor++);
        }
        return obj;
    }

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

    @Override
    public Object currentItem() {
        return list.get(cursor);
    }
}

聚集(Aggregate)角色: 给出创建迭代器(Iterator)对象的接口

/**
 * 聚集(Aggregate)角色
 */
public interface Aggregate {

    Iterator iterator();
}

具体聚集(Concrete Aggregate)角色: 实现了创建迭代器(Iterator)对象的接口,返回一个合适的具体迭代子实例

import java.util.ArrayList;
import java.util.List;

/**
 * 具体聚集(Concrete Aggregate)角色
 */
public class ConcreteAggregate implements Aggregate {

    private List<Object> list = new ArrayList<Object>();

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

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(list);
    }
}

客户端(Client)角色: 调用迭代器对象的迭代接口

/**
 * 客户端(Client)角色
 */
public class IteratorClient {

    public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>();
        list.add("item1");
        list.add("item2");
        list.add("item3");

        ConcreteAggregate aggregate = new ConcreteAggregate(list);
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.currentItem());
            iterator.next();
        }
    }
}

results matching ""

    No results matching ""