迭代器模式小试(二)

2014-11-23 21:55:26 · 作者: · 浏览: 8
System.out.println(list.get(3));
11 Iterator it = list.iterator();
12 while(it.hasNext()){
13 System.out.println(it.next());
14 }
15 }
16 }
复制代码
9,结果如下:
Apple:a
Apple:b
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。这就是迭代器模式。
三、Java的迭代器
  通常而言,我们遍历一个聚合对象除了使用Iterator外,还有一种更简便的方法,那就是用简易的for循环——for(Type t : Collection)。但是当我们用这个方式去访问上文我自定义的聚合对象MyList的时候,发现编译错误。错误提示说,因为我们没有实现java.lang.Iterable接口。  这个接口位于java.lang包下,意味着我们不用额外导包了。我们来看一下这个接口的源代码:
复制代码
package java.lang;
import java.util.Iterator;
public interface Iterable {
Iterator iterator();
}
复制代码
可见,这个接口只有一个方法,用来返回一个java.util.Iterator接口对象。相当于我们刚才的抽象类。
  Java的迭代器实现主要就是围绕着这两个接口,我们来看一下java.util.Iterator的源代码
复制代码
package java.util;
public interface Iterator {
boolean hasNext();
E next();
void remove();
}
复制代码
可以看到,这个接口是非常简单的。跟上面我自定义的Iterator相比,只是多了一个void remove()方法。
  下面我们将上面的例子改为Java的迭代器实现。通常而言,由于一个Iterator的实现类是对应一个聚合对象的。为了提高内聚性,我们应该将Iterator实现类作为聚合对象的内部类。而JDK也是这么做的。如下:
复制代码
1 import java.util.Iterator;
2
3 //实现Iterable接口
4 public class MyList implements Iterable{
5
6 private Object[] elements;
7 // 容量
8 private int capacity = 10;
9 // 当前大小
10 private int size = 0;
11
12 // 指定容量的构造方法
13 public MyList(int capacity)
14 {
15 this.capacity = capacity;
16 elements = new Object[10];
17 }
18
19 // 默认构造方法
20 public MyList()
21 {
22 this(10);
23 }
24
25 public int size()
26 {
27 return size;
28 }
29
30 public T get(int i)
31 {
32 if (i > capacity)
33 {
34 System.out.println("List数组越界");
35 return null;
36 }
37 else
38 {
39 return (T) elements[i];
40 }
41 }
42
43 public void add(T obj)
44 {
45 if (size >= capacity)
46 {
47 // 扩容
48 }
49 else
50 {
51 elements[size++] = obj;
52 }
53 }
54
55 //返回java.util.Iterator对象
56 @Override
57 public Iterator iterator()
58 {
59 return new IteratorImpl(this);
60 }
61
62 //内部类
63 class IteratorImpl implements Iterator {
64
65 private int index = 0;
66 MyList list = null;
67
68 public IteratorImpl(MyList list)
69 {
70 this.list = list;
71 }
72
73 @Override
74 public T next()
75 {
76 return (T) list.get(index++);
77 }
78
79 @Override
80 public boolean hasNext()
81 {
82 boolean flag = false;
83 if (list.get(index) != null)
84 {
85 flag = true;
86 }
87 return flag;
88 }
89
90 @Override
91 public void remove()
92 {
93
94 }
95 }
96 }
复制代码
同时,我们还可以使用简易for循环迭代这个聚合对象,如下:
复制代码
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 MyList list = new MyList();
6 list.add(new Apple("a"));
7 list.add(new Apple("b"));
8 // System.out.println(list.get(0));
9 // System.out.println(list.get(1))