23种设计模式-迭代器模式

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

类型:行为类模式

类图:

       如果要问Java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:

[java] view plain copy
  1. public static void print(Collection coll){  

  2.     Iterator it = coll.iterator();  

  3.     while(it.hasNext()){  

  4.         String str = (String)it.next();  

  5.         System.out.println(str);  

  6.     }  

  7. }  

       这个方法的作用是循环打印一个字符串集合,里面就用到了迭代器模式,java语言已经完整地实现了迭代器模式,Iterator翻译成汉语就是迭代器的意思。提到迭代器,首先它是与集合相关的,集合也叫聚集、容器等,我们可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,而迭代器的作用就是把容器中的对象一个一个地遍历出来。

 

迭代器模式的结构

 

代码实现

[java] view plain copy
  1. interface Iterator {  

  2.     public Object next();  

  3.     public boolean hasNext();  

  4. }  

  5. class ConcreteIterator implements Iterator{  

  6.     private List list = new ArrayList();  

  7.     private int cursor =0;  

  8.     public ConcreteIterator(List list){  

  9.         this.list = list;  

  10.     }  

  11.     public boolean hasNext() {  

  12.         if(cursor==list.size()){  

  13.             return false;  

  14.         }  

  15.         return true;  

  16.     }  

  17.     public Object next() {  

  18.         Object obj = null;  

  19.         if(this.hasNext()){  

  20.             obj = this.list.get(cursor++);  

  21.         }  

  22.         return obj;  

  23.     }  

  24. }  

  25. interface Aggregate {  

  26.     public void add(Object obj);  

  27.     public void remove(Object obj);  

  28.     public Iterator iterator();  

  29. }  

  30. class ConcreteAggregate implements Aggregate {  

  31.     private List list = new ArrayList();  

  32.     public void add(Object obj) {  

  33.         list.add(obj);  

  34.     }  

  35.   

  36.     public Iterator iterator() {  

  37.         return new ConcreteIterator(list);  

  38.     }  

  39.   

  40.     public void remove(Object obj) {  

  41.         list.remove(obj);  

  42.     }  

  43. }  

  44. public class Client {  

  45.     public static void main(String[] args){  

  46.         Aggregate ag = new ConcreteAggregate();  

  47.         ag.add("小明");  

  48.         ag.add("小红");  

  49.         ag.add("小刚");  

  50.         Iterator it = ag.iterator();  

  51.         while(it.hasNext()){  

  52.             String str = (String)it.next();  

  53.             System.out.println(str);  

  54.         }  

  55.     }  

  56. }  

       上面的代码中,Aggregate是容器类接口,大家可以想象一下Collection,List,Set等,Aggregate就是他们的简化版,容器类接口中主要有三个方法:添加对象方法add、删除对象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有两个方法:取得迭代对象方法next,判断是否迭代完成方法hasNext,大家可以对比java.util.List和java.util.Iterator两个接口自行思考。

 

迭代器模式的优缺点

        迭代器模式的优点有:

        迭代器模式的缺点:

 

迭代器模式的适用场景

       迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。

       但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。