迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象
迭代器模式结构:
抽象迭代子角色:此抽象角色定义出遍历元素所需的接口
具体迭代子角色:实现抽象迭代器接口,并保持迭代过程中的游标位置
抽象聚集角色:此抽象角色给出创建迭代子对象的接口
具体聚集角色:实现抽象聚集对象的接口,并返回一个合适的具体迭代子实例
客户端角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除
- 白箱聚集(外禀迭代子):
- //抽象聚集角色
- public abstract class Aggregate{
- //工厂方法返回一个迭代子
- public Iterator createIterator(){
- return null;
- }
- }
- //抽象迭代子角色
- public interface Iterator{
- //迭代方法:移动到第一个元素
- void first();
- //迭代方法:移动到下一个元素
- void next();
- //迭代方法:是否是最后一个元素
- boolean isDone();
- //迭代方法:返回当前元素
- Object currentItem();
- }
- //具体聚集角色
- public class ConcreteAggregate extends Aggregate{
- private Object[] obj = {
- "Monk Tang",
- "Monkey",
- "Pigsy",
- "Sandy",
- "Horse"
- };
- //工厂方法:返回一个迭代子对象
- public Iterator creteIterator(){
- return new ConcreteIterator(this);
- }
- //取值方法:向外界提供聚集元素
- public Object getElement(int index){
- if(index < obj.length){
- return obj[index];
- }else{
- return null;
- }
- }
- //取值方法,向外界提供聚集大小
- public int size(){
- return obj.length;
- }
- }
- 如果一个对象的内部状态在对象被创建之后就不再变化,这个对象就称为不变对象。如果一个聚集对象的内部状态可以改变的话
- 那么在迭代过程中,一旦聚集元素发生改变(比如一个元素被删除,或者一个新的元素被加进来),就会影响到迭代过程,使迭代无法
- 给出正确的结果。
- //具体《迭代子》角色
- public class ConcreteIterator implements Iterator{
- private ConcreteAggregate agg;
- private int index = 0;
- private int size = 0;
- public ConcreteIterator(ConcreteAggregate agg){
- this.agg = agg;
- size = agg.size();
- index= 0;
- }
- public void first(){
- index= 0;
- }
- public void next(){
- if(index < size){
- index++;
- }
- }
- public boolean isDone(){
- return (index >= size);
- }
- public Object currentItem(){
- return agg.getElement(index);
- }
- }
- //客户端
- public class Client{
- private Iterator it;
- private Aggregate agg = new ConcreteAggregate();
- public void operation(){
- it = agg.createIterator();
- while(!it.isDone()){
- System.out.println(it.currentItem().toString());
- it.next();
- }
- }
- public static void main(String args[]){
- Client client = new Client();
- client.operation();
- }
- }