设计模式--迭代器模式
1、迭代器模式
迭代器模式:又称为游标(cursor)模式,也就是抽象一个迭代器类来分离聚集的遍历行为,这样既可以做到不暴露聚集的内部结构,又可让外部代码透明地访问聚集内部的数据。
2、迭代器模式的结构
-
角色
抽象聚合角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口;
具体聚合角色:实现抽象聚合类,返回一个具体迭代器的实例;
抽象迭代器角色:定义访问和遍历聚合元素的接口,通常包含first()、next() 等方法;
具体迭代器角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
-
类图
3、迭代器模式举例
抽象聚合接口:Aggregate.java
1 package iterator; 2 /** 3 * 抽象聚合接口 4 * @author nick 5 * 6 */ 7 public interface Aggregate { 8 public abstract Iterator createIterator(); //定义抽象方法,返回迭代器类对象 9 }
具体聚合类:ConcreteAggregate.java
1 package iterator1; 2 /** 3 * 具体聚合角色 4 * @author nick 5 */ 6 public class ConcreteAggregate implements Aggregate { 7 8 private Object[] objArray = null; //定义对象数组 9 10 public ConcreteAggregate(Object[] objArray){ 11 //传入聚合对象的具体内容 12 this.objArray = objArray; 13 } 14 15 /** 16 * 实现聚合接口 17 * 调用具体迭代器中的构造方法 18 * 返回具体迭代器迭代器对象 19 */ 20 @Override 21 public Iterator createIterator() { 22 return new ConcreteIterator(this); 23 } 24 25 //获取聚集的大小 26 public int size(){ 27 return objArray.length; 28 } 29 30 // 获取聚集内的元素 31 public Object getElement(int index){ 32 if(index < objArray.length){ 33 return objArray[index]; 34 }else{ 35 return null; 36 } 37 } 38 }
抽象迭代器接口:Iterator.java
1 package iterator1; 2 /** 3 * 抽象迭代器接口 4 * @author nick 5 */ 6 public interface Iterator { 7 8 void first(); //移动到第一个元素 9 void next(); //移动到下一个元素 10 boolean isLast(); //是否是最后一个元素 11 Object currentItem(); //获取当前元素 12 }
具体迭代器类:ConcreteIterator.java
1 package iterator1; 2 /** 3 * 具体的迭代器 4 * @author nick 5 */ 6 public class ConcreteIterator implements Iterator { 7 private ConcreteAggregate agg; //持有被迭代的具体的聚合对象 8 private int index = 0; //内部索引,记录当前迭代到的索引位置 9 private int size = 0; //记录当前聚集对象的大小 10 11 public ConcreteIterator(ConcreteAggregate agg){ 12 this.agg = agg; 13 this.size = agg.size(); 14 index = 0; 15 } 16 17 @Override//移动到第一个元素 18 public void first() { 19 index = 0; 20 } 21 22 @Override//元素后移 23 public void next() { 24 if(index < size) 25 { 26 index ++; 27 } 28 } 29 30 @Override//判断是否为最后一个元素 31 public boolean isLast() { 32 return (index >= size)? true :false; 33 } 34 35 @Override//获取索引处的元素和 36 public Object currentItem() { 37 return agg.getElement(index); 38 } 39 }
主程序:Application.java
1 package iterator1; 2 /** 3 * 主程序入口 4 * @author nick 5 */ 6 public class Application { 7 public static void main(String[] args) { 8 9 Object[] objArray = {"One","Two","Three","Four","Five","Six"}; 10 Aggregate agg = new ConcreteAggregate(objArray);//创建聚合对象 11 //调用聚合对象中实现的创建迭代器的方法创建迭代器 12 Iterator iter = agg.createIterator(); 13 while(!iter.isLast()){//用迭代器遍历聚合对象中的元素和 14 System.out.println(iter.currentItem()); 15 iter.next(); 16 } 17 } 18 }
运行结果
4、迭代器模式的优缺点
-
优点1:迭代器模式简化了聚集的接口。迭代器具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。
-
优点2: 由于遍历算法被封装在迭代器角色里面,因此迭代的算法可以独立于聚集角色变化。
-
优点3:在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
-
缺点1:迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。