GOF23設計模式之叠代器模式(iterator)
阿新 • • 發佈:2018-01-22
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 returnthis.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)