设计模式之迭代器模式
2017-06-13 本文已影响11人
老羊_肖恩
迭代器模式的定义
迭代器模式(Iterator Pattern)的定义如下:
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 即:它提供一种方法访问衣蛾容器对象各个元素,而不暴露该对象的内部细节。
迭代器模式是为容器服务的,如Collection, Set等。迭代器模式就是为了解决便利这些容器中的元素而诞生的。其通用类图如下所示:
Iterator.jpg
适配器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。看一下迭代器模式中的各个角色:
- Iterator 抽象迭代器。抽象迭代器负责定义访问和遍历元素的接口。
- ConcreteIterator 具体迭代器。实现抽象迭代器定义的接口,完成容器遍历。
- Aggregate抽象容器。提供一个类似的iterator方法。
- ConcreteAggregate具体容器。实现容器接口定义的方法,创建出容纳迭代器的对象。
适配器模式的通用代码如下:
import java.util.Vector;
//抽象迭代器
interface Iterator{
//遍历下一个元素
public Object next();
//是否遍历到尾部
public boolean haNext();
//删除当前指向的元素
public boolean remove();
}
//具体迭代器
@SuppressWarnings("rawtypes")
class ConcreteIterator implements Iterator{
private Vector vector = new Vector();
//定义当前游标
private int cursor = 0;
public ConcreteIterator(Vector vector) {
this.vector = vector;
}
@Override
public Object next() {
if(this.haNext())
return this.vector.get(cursor++);
return null;
}
@Override
public boolean haNext() {
if(cursor == this.vector.size()){
return false;
}
return true;
}
@Override
public boolean remove() {
this.vector.remove(cursor);
return false;
}
}
//抽象容器
interface Aggregate{
//增加元素
public void add(Object obj);
//删除元素
public void remove(Object obj);
//迭代器
public Iterator iterator();
}
//具体容器类
@SuppressWarnings("rawtypes")
class ConreteAggregate implements Aggregate{
private Vector vector = new Vector();
@Override
public void add(Object obj) {
this.vector.add(obj);
}
@Override
public void remove(Object obj) {
this.vector.remove(obj);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(vector);
}
}
//客户端
public class IteratorClient{
public static void main(String[] args) {
//声明容器类
Aggregate agg = new ConreteAggregate();
//插入数据
agg.add("1");
agg.add("2");
agg.add("3");
//遍历
Iterator iterator = agg.iterator();
System.out.println("before iterator...");
while (iterator.haNext()) {
System.out.println(iterator.next());
}
System.out.println("after iterator...");
}
}
通用代码的运行结果如下:
before iterator...
1
2
3
after iterator...
迭代器模式的应用
JDK1.2开始增加了java.util.Iterator接口,将Iterator应用到各种Collections中。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。