迭代器模式,提供了接口访问容器中的元素,而不需要暴露容器的内部表现。
一、关键点
1)先看下这个模式点关键点:
遍历:该模式的最大特点就是提供了遍历内部集合数据的接口,从而达到访问集合数据的目的;
解耦:该模式以迭代器的身份去实现遍历集合对象的目的,从而不需要暴露内部的表示,达到了解耦的目的。
2)我们再看下它的类图关系:
Iterator:迭代器接口;
ConcreteIterator:迭代器具体的实现接口,实现对集合数据的访问;
Aggregate:容器集合的功能接口;
ConcreteAggregate:具体的容器类,通过相应的接口对外提供数据的访问。
二、实现
2.1 Iterator 迭代器抽象接口
public interface Iterator<T> {
boolean hasNext();
T next();
}
2.2 ConcreteIterator 具体迭代器类
public class ConcreteIterator<T> implements Iterator<T> {
private int mCursor;
private List<T> mList = new ArrayList<>();
public ConcreteIterator(List<T> list) {
mList = list;
}
@Override
public boolean hasNext() {
return mCursor != mList.size();
}
@Override
public T next() {
T obj = null;
if (hasNext()) {
obj = mList.get(mCursor++);
}
return obj;
}
}
2.3 Aggregate抽象容器接口
public interface Aggregate<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
2.4 ConcreteAggregate具体的容器实现对象
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> mList = new ArrayList<>();
@Override
public void add(T obj) {
mList.add(obj);
}
@Override
public void remove(T obj) {
mList.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<>(mList);
}
}
2.4 Client客户端类
public class Client {
public static void main(String[] args) {
Aggregate<String> containers = new ConcreteAggregate<>();
containers.add("hello");
containers.add("iterator");
Iterator<String> iterator = containers.iterator();
while (iterator.hasNext()) {
/* print iterator iterator.next() */
}
}
}
三、小结
3.1 访问方式 该模式提供了种不需要知道内部表示的访问方式,从而方便客户端方便直接地访问数据;
3.2 拓展与复用 该模式可以非常好地使用在一类型的集合对象上,并能根据需要拓展接口能力,灵活地变化。