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等,這些集合都有本身的迭代器。假如咱們要實現一個這樣的新的容器,固然也須要引入迭代器模式,給咱們的容器實現一個迭代器。

可是,因爲容器與迭代器的關係太密切了,因此大多數語言在實現容器的時候都給提供了迭代器,而且這些語言提供的容器和迭代器在絕大多數狀況下就能夠知足咱們的須要,因此如今須要咱們本身去實踐迭代器模式的場景仍是比較少見的,咱們只須要使用語言中已有的容器和迭代器就能夠了。

相關文章
相關標籤/搜索