设计模式(十四)—迭代器模式
最后更新于:2022-04-01 16:26:23
**定义**:它提供一个方法访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。
这个在javaAPI中已经封装的很好了,任何一个容器的遍历都可以使用Iterator来迭代。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340b68b90.jpg)
## 一般模式:
Iterator抽象迭代器
抽象迭代器负责定义访问和遍历元素的接口,基本上有三个方法。next()、hasNext()、remove();
ConcreteIterator具体迭代器
具体迭代器角色要实现迭代器的接口,完成容器元素的遍历。
Aggregate抽象容器
容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似iterator()方法
Concrete Aggregate具体容器。
具体容器实现容器接口定义的方法,创建出容纳迭代器的对象
~~~
public class IteratorTest {
public static void main(String[] args) {
//模拟容器,添加一些信息
Aggreragte aggVector = new ConcreteAggregate();
aggVector.add("lzl");
aggVector.add("xy");
aggVector.add("daughter");
//遍历
Iterator it = aggVector.iterator();
while(it.hasNext()){
//如果有下一个。获取信息
String info = (String) it.next();
System.out.println("------"+info);
}
}
}
/**
* 抽象的迭代器,只提供基本的方法。
*
* @author admin
*
*/
interface Iterator{
//删除
boolean remove();
//是否还有下一个
boolean hasNext();
//找到下一个元素。
Object next();
}
/**
* 具体接口的实现方法
* @author admin
*
*/
class ConcreteIterator implements Iterator{
private Vector vector ;
private int cursor = 0;
//构造函数,将需要遍历的vector对象传递进来
public ConcreteIterator(Vector vector) {
this.vector = vector;
}
@Override
public boolean remove() {
boolean flag = (boolean) this.vector.remove(this.cursor);
return flag;
}
@Override
public boolean hasNext() {
if(vector.size() != cursor){
return true;
}
return false;
}
@Override
public Object next() {
//如果还有下一个,就返回
if(this.hasNext()){
return this.vector.get(cursor++);
}
return null;
}
}
/**
* 抽想的接口容器类,例如java中的List集合等.
* @author admin
*
*/
interface Aggreragte{
//增加元素
boolean add(Object obj);
//创建迭代器的接口。
Iterator iterator();
//删除元素
boolean remove(Object obj);
}
/**
* 具体的抽象容器接口实现类,例如java中的ArrayList集合。
* @author admin
*
*/
class ConcreteAggregate implements Aggreragte{
private Vector vector = new Vector();
@Override
public Iterator iterator() {
return new ConcreteIterator(this.vector);
}
@Override
public boolean add(Object obj) {
boolean flag = vector.add(obj);
return flag;
}
@Override
public boolean remove(Object obj) {
boolean flag = vector.remove(obj);
return flag;
}
}
~~~