迭代器模式用于实现将聚合对象中数据的存储和访问分离,达到聚合类单一职责的原则。所谓聚合对象,就是可以存放多个其他对象的对象,如java的ArrayList等。这个设计模式的理解难度不大。
以下是结构图:
ok,接下来我们先看一下迭代器的使用:
public class FiftenthIterator {
private ArrayList<String> ss = new ArrayList<String>();
public void add(){
ss.add("a");
ss.add("b");
ss.add("c");
ss.add("d");
ss.add("e");
ss.add("f");
ss.add("g");
}
public void iterator(){
Iterator<String> it = ss.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
FiftenthIterator f = new FiftenthIterator();
f.add();
f.iterator();
}
}
这是使用JDK设计的迭代器,有了迭代器,遍历聚合对象就相当容易了。以下是一个简单的例子:
public class FiftenthIterator {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClass myclass = new MyClass();
myclass.add(new Student("a",10));
myclass.add(new Student("b",12));
myclass.add(new Student("c",14));
myclass.add(new Student("d",16));
StudentIterator it = myclass.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s);
}
}
}
class Student{
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return name+","+age;
}
}
class MyClass{
ArrayList<Student> ss = new ArrayList<Student>();
public void add(Student s){
ss.add(s);
}
public Student get(int i){
return ss.get(i);
}
public Student remove(int i){
return ss.remove(i);
}
public boolean remove(Student s){
return ss.remove(s);
}
public StudentIterator iterator(){
return new StudentIterator(this);
}
public ArrayList<Student> getStudents(){
return ss;
}
}
class StudentIterator{
MyClass c;
int cursor;
public StudentIterator(MyClass c){
this.c = c;
}
public boolean hasPrevious(){
return cursor > 0;
}
public boolean hasNext(){
return cursor < c.getStudents().size();
}
public Student previous(){
return c.get(cursor--);
}
public Student next(){
return c.get(cursor++);
}
}
例子实在太简单,没什么说的。
如果要写一个更通用的迭代器就要精心地设计了。
java的ArrayList获得的迭代器是其父类的内部类,那么迭代器类就可以方便地访问其外部类的方法了,也就省去了构造方法,其根本原因在于,它隐含地持有了其外部类的引用。关于更加具体的,可以参考ArrayList源代码,还是很容易看明白这部分的。