Gof说:提供一种方法顺序访问一个聚合对象中的各元素,而又不暴露该对象的内部表示。
关键思想是将对列表的访问和遍历从列表对象中分离出来,并放入一个迭代器(iterator)对象中。
示例:班级(Classes)是一个聚合对象,里面包含一定数量的学生(Student),获取每个学生的信息。
Aggregate代表聚集体.实现了Aggregate接口的类都属于聚集体.包含一个获取迭代器的iterate的方法.
Iterator迭代器接口,提供执行遍历的功能hasNext与next方法.
Classes为班级类,实现了Aggregate接口所以它是一个聚集体,内部包含了一个Student数组和一个size,可以添加学生和获取班级迭代器进行迭代.
ClassesIterator班级类的迭代器,实现了Iterator接口,提供对班级内的学生进行迭代的功能.包含一个被迭代班级的对象和一个迭代索引位置.
Student学生信息.
代码Aggregate:
代码Iterator:
代码Classes:
代码ClassesIterator:
代码Student:
测试代码IteratorTest:
Iterator:
ClassesIterator:
IteratorTest:
为什么要在Iterator Pattern这么麻烦的东西上花时间?以数组概念思考Pattern,用for语句让他循环下去不就得了吗?为什么出了聚合之外,还要特别建立像Iterator这样的参与者?
最大的理由是因为利用Iterator可以跟实现分开,单独进行递增,请看下面的程序代码:
这里只用到hasNext和next这两个Iterator的方法。并没有调用Classes实现时所使用的方法。换句话说,这里的while循环不会受到Classes实现的影响。
像上面的例子开始的时候使用数组管理学生,后面换成了vector。无论Classes修改成怎样,Classes仍然还有iterate方法,只要能返回正确的Iterator(即返回正常实现了hasNext,next方法的类的对象实例),上面的while循环即使一字不改也能正常执行。