23种设计模式(13):迭代器模式

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

类型:行为类模式 java

类图: 算法

23种设计模式(13):迭代器模式 - 第1张  | 快课网

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

1
2
3
4
5
6
7
public static void print ( Collection coll ) {
     Iterator it = coll . iterator ( ) ;
     while ( it . hasNext ( ) ) {
         String str = ( String ) it . next ( ) ;
         System . out . println ( str ) ;
     }
}

 

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

 

迭代器模式的结构 this

  • 抽象容器:通常是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器:就是抽象容器的具体实现类,好比List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器:定义遍历元素所须要的方法,通常来讲会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
  • 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。

代码实现: spa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
interface Iterator {
     public Object next ( ) ;
     public boolean hasNext ( ) ;
}
class ConcreteIterator implements Iterator {
     private List list = new ArrayList ( ) ;
     private int cursor = 0 ;
     public ConcreteIterator ( List list ) {
         this . list = list ;
     }
     public boolean hasNext ( ) {
         if ( cursor == list . size ( ) ) {
             return false ;
         }
         return true ;
     }
     public Object next ( ) {
         Object obj = null ;
         if ( this . hasNext ( ) ) {
             obj = this . list . get ( cursor ++ ) ;
         }
         return obj ;
     }
}
interface Aggregate {
     public void add ( Object obj ) ;
     public void remove ( Object obj ) ;
     public Iterator iterator ( ) ;
}
class ConcreteAggregate implements Aggregate {
     private List list = new ArrayList ( ) ;
     public void add ( Object obj ) {
         list . add ( obj ) ;
     }
 
     public Iterator iterator ( ) {
         return new ConcreteIterator ( list ) ;
     }
 
     public void remove ( Object obj ) {
         list . remove ( obj ) ;
     }
}
public class Client {
     public static void main ( String [ ] args ) {
         Aggregate ag = new ConcreteAggregate ( ) ;
         ag . add ( "小明" ) ;
         ag . add ( "小红" ) ;
         ag . add ( "小刚" ) ;
         Iterator it = ag . iterator ( ) ;
         while ( it . hasNext ( ) ) {
             String str = ( String ) it . next ( ) ;
             System . out . println ( str ) ;
         }
     }
}

 

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

迭代器模式的优缺点 设计

迭代器模式的优势有: code

  • 简化了遍历方式,对于对象集合的遍历,仍是比较麻烦的,对于数组或者有序列表,咱们尚能够经过游标来取得,但用户须要在对集合了解很清楚的前提下,自行遍历对象,可是对于hash表来讲,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
  • 能够提供多种遍历方式,好比说对有序列表,咱们能够根据须要提供正序遍历,倒序遍历两种迭代器,用户用起来只须要获得咱们实现好的迭代器,就能够方便的对集合进行遍历了。
  • 封装性良好,用户只须要获得迭代器就能够遍历,而对于遍历算法则不用去关心。

迭代器模式的缺点:

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,你们可能都有感受,像ArrayList,咱们宁肯愿意使用for循环和get方法来遍历集合。

 

迭代器模式的适用场景

迭代器模式是与集合共生共死的,通常来讲,咱们只要实现一个集合,就须要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有本身的迭代器。假如咱们要实现一个这样的新的容器,固然也须要引入迭代器模式,给咱们的容器实现一个迭代器。

可是,因为容器与迭代器的关系太密切了,因此大多数语言在实现容器的时候都给提供了迭代器,而且这些语言提供的容器和迭代器在绝大多数状况下就能够知足咱们的须要,因此如今须要咱们本身去实践迭代器模式的场景仍是比较少见的,咱们只须要使用语言中已有的容器和迭代器就能够了。

相关文章
相关标签/搜索