GOF23设计模式之迭代器模式(iterator)

一、迭代器模式概述

  提供一种可以遍历聚合对象的方式。又称为:游标(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)…………

posted @ 2018-01-22 15:30  C3Stones  阅读(252)  评论(0编辑  收藏  举报