设计模式学习笔记 - 迭代器模式

274 阅读1分钟

对外提供统一的顺序访问数据的的接口。不对外暴露内部细节。

当面对多种数据源,并且,数据存储的格式不同(list,数组),可以使用迭代器,将访问数据的格式进行统一,不对外暴露内部细节。

例子来源 《Android源码设计模式解析与实战》

迭代器接口

 public interface Iterator<T> {
    T next();

    boolean hasNext();
}


容器接口,用来获取具体迭代器角色

public interface Aggregate<T> {
    Iterator<T> iterator();
}

具体的迭代器类,实现迭代器接口,并记录遍历的当前位置。


public class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list ;
    int index = 0;

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

    @Override
    public T next() {
        if (hasNext()) {
            return list.get(index++);
        }
        return null;
    }

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


具体的容器类,迭代器角色与容器关联。


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

    public void add(T t) {
        list.add(t);
    }

    public void remove(T t) {
        list.remove(t);
    }

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

client

 public class Main {
    public static void main(String[] args) {
        ConcreteAggregate concreteAggregate = new ConcreteAggregate();
        concreteAggregate.add("TtTTT4");
        concreteAggregate.add("TtTTT3");
        concreteAggregate.add("TtTTT2");
        concreteAggregate.add("TtTTT1");
        Iterator<String> iterator = concreteAggregate.iterator();
        while (iterator.hasNext()) {
            String s = iterator.next();
            System.out.println(s);
        }
    }
}