您的位置:首页 > 其它

设计模式 -- Iterator(迭代器)

2010-10-03 00:09 375 查看
模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素。
设计一个容器的接口,用来定义这些”能装载任意对象的容器”的方法,从而在使用这些容器的时候可以更加灵活,更换起来只需要更改装载的容器的类型即可,其他方法都不用改变。
Ø 接口Collection.java
package com.yilong.designpattern.iterator;
public interface Collection {

public void add(Object obj);
public int size();
public Iterator iterator();
}
Ø 实现了Collection接口的ArrayList.java
package com.yilong.designpattern.iterator;
public class ArrayList implements Collection {

Object[] objs = new Object[10];
int index = 0;

public void add(Object obj) {
if(index == objs.length) {
Object[] newObjs = new Object[objs.length * 2];
System.arraycopy(objs, 0, newObjs, 0, objs.length);
objs = newObjs;
}
objs[index] = obj;
index ++;
}

public Iterator iterator() {
return new ArrayIterator(this);
}

public int size() {
return index;
}

public Object get(int i) {
return objs[i];
}
}
说明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs数组中索引为0-objs.length的元素复制到数组newObjs中,第一个0表示从newObjs的0位置开始复制。
容器的iterator()方法会调用适合本身容器进行遍历的迭代器Iterator。
还需要注意的一点是get(int i)方法不要放在Collection接口的方法定义中,因为Collection接口已经有iterator()方法足以遍历容器中元素了, 可见get(int i)方法并不是每种容器都必须的,因此更加适合于只定义在具体的容器中。
Ø 迭代器接口Iterator.java
package com.yilong.designpattern.iterator;
public interface Iterator {

public boolean hasNext();
public Object next();
}
说明:该接口主要有两个方法,一个是判断容器中是否还有下一个元素的hasNext(),另一个是取出容器中下一个元素next()方法。
Ø 实现了Iterator接口的ArrayIterator.java
package com.yilong.designpattern.iterator;
public class ArrayIterator implements Iterator{
private ArrayList arrayList;
private int index = 0;

ArrayIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}

public boolean hasNext() {
if(this.index < this.arrayList.size()) {
return true;
} else {
return false;
}
}

public Object next() {
Object obj = arrayList.get(this.index);
this.index ++;
return obj;
}
}
说明:主要用以对ArrayList容器进行遍历的iterator类。
Ø Book.java
package com.yilong.designpattern.iterator;
public class Book {

private String bookName;

public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Ø Main.java
package com.yilong.designpattern.iterator;
public class Main {

public static void main(String[] args) {
Collection objList = new ArrayList();
objList.add(new Book("《名侦探柯南》"));
objList.add(new Book("《游戏王》"));
objList.add(new Book("《三国演义》"));
Iterator iterator = objList.iterator();
while(iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getBookName());
}
}
}
该设计模式的UML图如下:

说明:JDK的Iterator与上述的设计原理完全一样,因此测试的代码可以直接copy上述的代码,只需要引入具体的包即可。
Ø Main.java
package com.yilong.test.jdk.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class TestIterator {

public static void main(String[] args) {
Collection bookShelfs = new ArrayList();
bookShelfs.add(new Book("福尔摩斯"));
bookShelfs.add(new Book("名侦探柯南"));
bookShelfs.add(new Book("游戏王"));
System.out.println(bookShelfs.size());
Iterator bookShelfIterator = bookShelfs.iterator();
while(bookShelfIterator.hasNext()) {
Book book = (Book)bookShelfIterator.next();
System.out.println(book.getName());
}

ArrayList arrayList = new ArrayList();
System.out.println(arrayList.get(0));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: