设计模式--迭代器模式

设计模式--迭代器模式

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:迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

原文地址:https://www.cnblogs.com/sinlearn/p/11881506.html