1. 程式人生 > >GOF23設計模式之叠代器模式(iterator)

GOF23設計模式之叠代器模式(iterator)

jdk gre reat ray ring return 示例代碼 開發 叠代器模式

一、叠代器模式概述

  提供一種可以遍歷聚合對象的方式。又稱為:遊標(cursor)模式

  結構:

    (1)聚合對象:存儲數據

    (2)叠代器:遍歷數據

二、叠代器模式示例代碼

  定義:正向遍歷叠代器和逆向遍歷叠代器

 1 /**
 2  * 自定義叠代器接口
 3  * @author CL
 4  *
 5  */
 6 public interface MyIterator {
 7     /**
 8      * 如果仍有元素可以叠代,則返回 true
 9      * @return
10      */
11     boolean hasNext();
12     /**
13 * 返回叠代的下一個元素 14 * @return 15 */ 16 Object next(); 17 /** 18 * 從叠代器指向的集合中移除叠代器返回的最後一個元素 19 */ 20 void remove(); 21 22 }
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 /**
 5  * 自定義聚合類
 6  * @author CL
 7  *
 8  */
 9 public class ConcreteAggregate {
10 private List<Object> list; 11 12 public ConcreteAggregate() { 13 list = new ArrayList<Object>(); 14 } 15 16 public boolean addObject(Object obj) { 17 return this.list.add(obj); 18 } 19 20 public boolean removeObject(Object obj) { 21 return
this.list.remove(obj); 22 } 23 24 /** 25 * 獲得正向遍歷的叠代器對象 26 * @return 27 */ 28 public MyIterator creatIterator() { 29 return new ConcreteIterator(0); 30 } 31 32 /** 33 * 獲得逆向遍歷的叠代器對象 34 * @return 35 */ 36 public MyIterator creatConverseIterator() { 37 return new ConcreteIterator(list.size()-1); 38 } 39 40 /** 41 * 自定義叠代器內部類 42 * @author CL 43 * 44 */ 45 private class ConcreteIterator implements MyIterator { 46 47 private int cursor; 48 49 private final int firstValue; 50 51 public ConcreteIterator(int cursor) { 52 this.cursor = cursor; 53 this.firstValue = cursor; 54 } 55 56 @Override 57 public boolean hasNext() { 58 if (firstValue == 0) { //正向遍歷 59 if (cursor < list.size()) { 60 return true; 61 } 62 } else if (firstValue == list.size()-1) { //逆向遍歷 63 if (cursor >= 0) { 64 return true; 65 } 66 } 67 return false; 68 } 69 70 @Override 71 public Object next() { 72 if (firstValue == 0) { //正向遍歷 73 if (cursor < list.size()) { 74 return list.get(cursor++); 75 } 76 } else if (firstValue == list.size()-1) { //逆向遍歷 77 if (cursor >= 0) { 78 return list.get(cursor--); 79 } 80 } 81 return null; 82 } 83 84 @Override 85 public void remove() { 86 list.remove(cursor); 87 } 88 } 89 }

  測試:

 1 /**
 2  * 測試叠代器對象
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         ConcreteAggregate ca = new ConcreteAggregate();
10         ca.addObject("aa");
11         ca.addObject("bb");
12         ca.addObject("cc");
13         ca.addObject("dd");
14         
15         System.out.println("正向遍歷:");
16         MyIterator it = ca.creatIterator();
17         while (it.hasNext()) {
18             System.out.println(it.next());
19         }
20         
21         System.out.println("逆向遍歷:");
22         MyIterator it2 = ca.creatConverseIterator();
23         while (it2.hasNext()) {
24             System.out.println(it2.next());
25         }
26     }
27 }

  控制臺輸出:

正向遍歷:
aa
bb
cc
dd
逆向遍歷:
dd
cc
bb
aa

三、叠代器模式常見開發應用場景

  (1)JDK內置的叠代器(List / Set)

     List / Set 實現了 Collection 接口,Collection 實現了 Iterator 接口。

  (2)…………

GOF23設計模式之叠代器模式(iterator)