概念
- 迭代器模式提供了一种方法访问一个容器中各个元素,而又不需要暴露该对象的内部细节
- 在1.中提到的容器,其实就是可以包含一组对象的数据结构,如Java中Collection和Set
角色
- Iterator:抽象迭代器
- ConcreteIterator:具体迭代器
- Aggregate :抽象容器
- Concrete Aggregate:具体容器
demo
- 先定义抽象迭代器,其实就是java.util下的迭代器
- hasNext返回该迭代器中是否还有未遍历过的元素
- next返回下一个元素
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
具体的类实现了Iterator接口,并实现了其中的方法
/**
* @author : jzb219@gmial.com
* @description : 具体迭代器
* @date : 2018/7/30 下午3:48
*/
public class MenuIterator implements Iterator {
String[] foods;
int position;
public MenuIterator(String[] foods) {
this.foods = foods;
}
@Override
public boolean hasNext() {
return position != foods.length;
}
@Override
public Object next() {
String food = foods[position];
position += 1;
return food;
}
}
抽象容器
/**
* @author : jzb219@gmial.com
* @date : 2018/7/30
*/
public interface Menu {
void add(String name);
Iterator getIterator();
}
定义一个容器用来实现Menu
/**
* @author : jzb219@gmial.com
* @description : 具体容器
* @date : 2018/7/30 下午3:55
*/
public class ChineseFoodMenu implements Menu {
private String[] foods = new String[4];
private int position = 0;
@Override
public void add(String name) {
foods[position] = name;
position += 1;
}
@Override
public Iterator getIterator() {
return new MenuIterator(this.foods);
}
}
测试
/**
* @author : jzb219@gmial.com
* @description : 测试类
* @date : 2018/7/30 下午3:56
*/
public class IteratorDomain {
public static void main(String[] args) {
ChineseFoodMenu chineseFoodMenu = new ChineseFoodMenu();
chineseFoodMenu.add("红烧肉");
chineseFoodMenu.add("剁椒鱼头");
chineseFoodMenu.add("烤全羊");
chineseFoodMenu.add("夫妻肺片");
Iterator iterator = chineseFoodMenu.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
结果
红烧肉
剁椒鱼头
烤全羊
夫妻肺片
总结
1.迭代器使用很广泛,Java中提供了java.util.Iterator。而且很多容器(Collection,Set)都提供了对迭代器的支持
参考
http://www.hollischuang.com/archives/1765
写在最后
做一个灵魂和肉体分离的人,灵魂不受肉体的束缚,灵魂可以指挥肉体