这个模式是在复习java的集合类时候发现的,有一句话是
Iterator iterator = c.iterator();
这句话的意思就是获取他的迭代器,可以通过迭代器hasNext判断集和里是否有元素,next返回集合中元素。
由于不同的collection有不有同的遍历操作,为了统一接口。添加每个实现 collection接口的类都要实现Iterator。这样就提供了统一的方法,遍历数据。给编程者带来方便。这种做法也被 称作为 Iterator 设计模式。
Iterator的特点:
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
类图:
这张图完整的勾勒了各个类接口之间的关系。
首先说明Aggregate是容器接口,
ConcreteAggregate是容器接口实现,
Iterator是迭代器接口,
ConcreteIterator是迭代器接口的实现;
在Aggregate里面定义了iterator()方法,因此在它的实现类ConcreteAggregate中需要实现该方法,并返回了一个迭代器的的实例ConcreteIterator(list)。
迭代器的实现类的构造函数中有list,该list就是该容器的一个实例,因此
Iterator iterator = c.iterator();
这样就可以直接访问到该容器的内部的内容,而在外部不暴露出来。
其次提供了统一的接口访问不同的容器
代码实现:
容器接口
public interface Aggregate {
public void add(Object o);
public void remove(Object o);
public Iterator iterator();
}
容器实现
public class ConcreteAggregate implements Aggregate{
private List list = new ArrayList();
@Override
public void add(Object o){
list.add(o);
}
@Override
public void remove(Object o){
list.remove(o);
}
@Override
public Iterator iterator(){
return new ConcreteIterator(list);
}
}
迭代器接口
public interface Iterator {
public Object next();
public boolean hasNext();
}
迭代器实现
public class ConcreteIterator implements Iterator{
private int cursor =0;
private List list = new ArrayList();
public ConcreteIterator(List list) {
this.list = list;
}
@Override
public boolean hasNext() {
if(cursor==list.size()){
return false;
}
return true;
}
@Override
public Object next() {
Object obj = null;
if(this.hasNext()){
obj = this.list.get(cursor++);
}
return obj;
}
}
测试类
public class Demo {
public static void main(String[] args) {
//Aggregate aggregate = new Aggregate(); Aggregate是一个接口不能被实例化
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("小苍");
aggregate.add("小井");
aggregate.add("小空");
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()){
String s = (String) iterator.next();
System.out.println(s);
}
}
}