迭代器模式 有更新!
迭代器模式
什么是迭代器模式?
让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。迭代器模式可以控制外部访问容器内部数据的顺序。
容器实现Iterable接口,致力于提供符合Iterator实现的数据格式。需要遍历容器数据的方法则是使用Iterator提供的数据遍历方法进行数据访问,这样我们处理容器数据的逻辑就和容器本身的实现解耦了,因为我们只需要使用Iterator接口就行了,只要使用的容器提供Iterator对象,我们完全不用关心容器怎么实现,底层数据如何访问之类的问题。而且更换容器的时候也不需要修改数据处理逻辑。
为什么不让容器直接继承Iterator接口,Iterable接口会不会有一种多此一举的感觉?
为了让数据处理逻辑和容器内部数据管理进行分离,提供容器内数据安全性。假设容器实现了Iterator接口,那么我们所有通过Iterator接口进行的数据访问修改操作都会直接影响容器内的数据,因为我们访问的数据和容器维护的数据是同一份数据。其实这样做是很不安全的,因为你也不知道用户访问这个数据会做什么操作,那不如让Iterator接口访问数据副本来的安全。这样大家各管各的,互不影响
自己实现容器
package com.swjsj.design.pattern;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;
public class MyContainer<E> implements Iterable<E> {
private Object[] eles;
public MyContainer(Object[] eles) {
this.eles = eles;
}
@Override
public Iterator<E> iterator() {
return new Itr();
}
@Override
public void forEach(Consumer<? super E> action) {
}
@Override
public Spliterator<E> spliterator() {
return null;
}
public class Itr implements Iterator<E> {
private int position = -1;
private Object[] data = eles;
@Override
public boolean hasNext() {
return ++position < data.length;
}
@Override
public E next() {
return (E) data[position];
}
}
}
测试迭代器
package com.swjsj.design.pattern;
import java.util.Iterator;
public class IterateWithIterator<E> {
public static void main(String[] args) {
MyContainer myContainer = new MyContainer<String>(new String[]{"1ss", "2s", "3s", "4s", "44s", "6s"});
Iterator iterator = myContainer.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}