天天看點

疊代器模式

今天要說的疊代器模式,實際上就是Java已經為我們實作好了,那就是Java的Iterator類。包括很多程式設計語言也有自己的疊代器類,但同時它也是一個設計模式,是以在我們實作疊代器模式的時候實際上就是在實作一個疊代器類。

我們先來了解何為疊代器?其實你把它簡單了解為for循環也沒什麼問題,可以說是它是for循環的進階形式。它提供一種方法順序通路一個聚合對象中各個元素,而又不暴露該對象的内部表示。我們為它提供開始、下一個、是否結束等方法。

定義一個疊代器接口,包含以下方法。

1 package day_28_iterator;
 2 
 3 /**
 4  * 疊代器接口
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Iterator {
10     Object first();    //第一個元素
11     Object next();    //下一個元素
12     boolean isFinished();    //是否到結尾
13     Object currentItem();    //目前周遊的對象
14 }      

具體的疊代器類。

1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具體疊代器類
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteIterator implements Iterator {
12     private int currentIndex = 0;
13     private Vector vector = null;
14     
15     public ConcreteIterator(Vector vector){
16         this.vector = vector;
17     }
18     
19     /* (non-Javadoc)
20      * @see day_28_iterator.Iterator#first()
21      */
22     @Override
23     public Object first() {
24         currentIndex = 0;
25         return vector.get(currentIndex);
26     }
27 
28     /* (non-Javadoc)
29      * @see day_28_iterator.Iterator#next()
30      */
31     @Override
32     public Object next() {
33         return vector.get(currentIndex++);
34     }
35 
36     /* (non-Javadoc)
37      * @see day_28_iterator.Iterator#isFinished()
38      */
39     @Override
40     public boolean isFinished() {
41         if (currentIndex > this.vector.size() - 1){
42             return true;
43         } else {
44             return false;
45         }
46     }
47 
48     /* (non-Javadoc)
49      * @see day_28_iterator.Iterator#currentItem()
50      */
51     @Override
52     public Object currentItem() {
53         return currentIndex;
54     }
55 
56 }      

定義一個聚合類接口,用來模拟集合。

1 package day_28_iterator;
 2 
 3 /**
 4  * 聚集(集合)接口,模拟集合接口,增删
 5  * @author turbo
 6  *
 7  * 2016年9月29日
 8  */
 9 public interface Aggregate {
10     Iterator createIterator();    //建立疊代器
11     void add(Object obj);    //新增元素
12     void remove(Object obj);    //删除元素
13 }      
1 package day_28_iterator;
 2 
 3 import java.util.Vector;
 4 
 5 /**
 6  * 具體聚集類
 7  * @author turbo
 8  *
 9  * 2016年9月29日
10  */
11 public class ConcreteAggregate implements Aggregate {
12     private Vector vector = null;
13     
14     public void setVector(Vector vector) {
15         this.vector = vector;
16     }
17     public Vector getVector() {
18         return vector;
19     }
20     
21     public ConcreteAggregate(){
22         vector = new Vector();
23     }
24     
25     /* (non-Javadoc)
26      * @see day_28_iterator.Aggregate#createIterator()
27      */
28     @Override
29     public Iterator createIterator() {
30         return new ConcreteIterator(vector);
31     }
32     /* (non-Javadoc)
33      * @see day_28_iterator.Aggregate#add(java.lang.Object)
34      */
35     @Override
36     public void add(Object obj) {
37         this.vector.add(obj);
38     }
39     /* (non-Javadoc)
40      * @see day_28_iterator.Aggregate#remove(java.lang.Object)
41      */
42     @Override
43     public void remove(Object obj) {
44         this.vector.remove(obj);
45     }
46     
47 }      

我們來看看用戶端。

1 package day_28_iterator;
 2 
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月29日
 7  */
 8 public class Main {
 9 
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         Aggregate agg = new ConcreteAggregate();
15         agg.add("a");
16         agg.add("b");
17         agg.add("c");
18         Iterator iterator = agg.createIterator();
19         while (!iterator.isFinished()){
20             System.out.println(iterator.next());
21         }
22         
23     }
24 
25 }      

這樣我們就簡單的實作了一個疊代器,當需要對聚集(集合)有多種方式周遊時,可以考慮用疊代器模式,在下一篇中,我們會去JDK源代碼看看Java是如何實作Iterator疊代器類的。

不積跬步,無以至千裡;不積小流,無以成江海。

上一篇: 備忘錄模式
下一篇: 橋接模式