本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/
迭代器模式简介
迭代器相信大部分人都不陌生,java/c++等很多编程语言的容器类都支持迭代器操作,这个模式就是介绍迭代器实现的细节。
迭代器模式的定义和基本结构
定义:提供一个可以顺序访问一个聚合对象中的各个元素有不暴露器内部实现的方法。
一张来自《Head First》的结构图。
client:调用Iterator对ConcreteAggregate内的元素进行迭代而不需要关系ConcreteAggregate的具体结构。
ConcreteAggregate:某种聚合类的代表,如ArrayList之类。
ConcreteIterator:与某种聚合类关联的迭代器类,实现了Iterator接口,每一种具体的聚合类类型都会有一个对应的ConcreteIterator。
Iterator:这个接口包含了迭代器的一般方法。
Aggregate:包含createIterator()方法,继承了这个接口就表示这个聚合类支持迭代器,调用createIterator()方法就可以获得这个迭代器。
一个简单的实例(java)
不用什么例子了,我们就实现一个针对ArrayList的迭代器当练习就好。
我们先写一个新的类把ArrayList包装一下,就叫MyArrayList,然后实现一个针对MyArrayList的迭代器。
MyArrayList将继承一个Iterable接口,这个接口是java提供的,实现这个接口表示这个聚合类支持迭代器,和上面结构中的Aggregate作用一样,只不过Iterable里的方法叫做iterator()。代码如下。
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 public class MyArrayList implements Iterable<String> { 4 ArrayList<String> arrayList; 5 int position=0; 6 public MyArrayList(){ 7 arrayList=new ArrayList<String>(); 8 } 9 public void addItem(String s){ 10 arrayList.add(s); 11 } 12 public void removeItem(int index){ 13 arrayList.remove(index); 14 } 15 public int size(){ 16 return arrayList.size(); 17 } 18 public String getItem(int index){ 19 return arrayList.get(index); 20 } 21 @Override 22 public Iterator<String> iterator() { 23 return new MyArrayListIterator(this); 24 } 25 }
之后实现MyArrayListIterator类,也就是结构图中的ConcreteIterator类,他将继承java提供的Iterator接口,里面有hasNext(),next(),remove()三个方法需要实现,我们实现前两个就可以完成迭代,第三个先直接抛出一个异常把,大家也可以自己实现,反正很简单。
1 import java.util.Iterator; 2 public class MyArrayListIterator implements Iterator<String> { 3 MyArrayList myArrayList; 4 int position=0; 5 public MyArrayListIterator(MyArrayList m){ 6 myArrayList=m; 7 } 8 @Override 9 public boolean hasNext() { 10 if(myArrayList.size()>position) 11 return true; 12 return false; 13 } 14 @Override 15 public String next() { 16 return myArrayList.getItem(position++); 17 } 18 @Override 19 public void remove() { 20 throw new UnsupportedOperationException(); 21 } 22 }
测试代码如下。
1 import java.util.Iterator; 2 public class Test { 3 public static void main(String[] args) { 4 MyArrayList m=new MyArrayList(); 5 m.addItem("first"); 6 m.addItem("second"); 7 m.addItem("tired"); 8 m.addItem("fourth"); 9 m.addItem("fifth"); 10 Iterator<String> it= m.iterator(); 11 while(it.hasNext()){ 12 System.out.println(it.next()); 13 } 14 } 15 }
输出如下:
关于for/in语句(Java 5)
在java 5之后,java 给出了一种新的for语句让我们迭代聚合类,只要是支持Iterator的聚合类都可以用这种语句来迭代,简例如下
1 import java.util.Iterator; 2 public class Test { 3 public static void main(String[] args) { 4 MyArrayList m=new MyArrayList(); 5 m.addItem("first"); 6 m.addItem("second"); 7 m.addItem("tired"); 8 m.addItem("fourth"); 9 m.addItem("fifth"); 10 Iterator<String> it= m.iterator(); 11 // while(it.hasNext()){ 12 // System.out.println(it.next()); 13 // } 14 for(String s:m){ 15 System.out.println(s); 16 } 17 } 18 }
输出和上面并没有区别。
迭代器模式到此结束,这个模式对程序员来说简直是太熟悉了,超级简单对不对?(^∇^*)。
参考资料:《Head First 设计模式》。