通常情况下,如果你要处理一组相同对象的集合,你会怎么做?
把它们放进List里面,然后再用Iterator方法遍历它们。
有没有想过让你自己设计的对象具有这样的iterator()方法?不用自己去一个一个的new它们。
好吧,你需要一个这样的结构:
一个抽象对象接口(它具有初始化具体对象的方法,迭代器方法)
几个具体实现类来实现这样的接口,并具有传参构造函数
一个继承了Iterator接口的抽象接口
一个具体实现类来实现这个抽象的iterator接口
一个调用者
代码如下:
抽象的对象接口
public interface CommonObject {
public void add(String name, String description);
public void print();
public CommonIterator iterator();
}
具体对象的实现类
import java.util.ArrayList;
import java.util.List;
public class MyCommonObject implements CommonObject {
private List<CommonObject> list = new ArrayList<CommonObject>();
private String name;
private String description;
public MyCommonObject() {}
public MyCommonObject(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public void add(String name, String description) {
this.list.add(new MyCommonObject(name, description));
}
@Override
public void print() {
System.out.println("----------------");
System.out.println("Name: " + this.name + ";\nDescription: " + this.description);
}
@Override
public CommonIterator iterator() {
return new MyCommonObjectIterator(this.list);
}
}
自定义的抽象迭代器接口
import java.util.Iterator;
public interface CommonIterator extends Iterator {
}
具体的迭代器实现类
import java.util.ArrayList;
import java.util.List;
public class MyCommonObjectIterator implements CommonIterator {
private List<CommonObject> list = new ArrayList<CommonObject>();
private int position = 0;
public MyCommonObjectIterator(List<CommonObject> list) {
this.list = list;
}
@Override
public boolean hasNext() {
if (this.position >= list.size() || list.get(position) == null) return false;
return true;
}
@Override
public Object next() {
return (CommonObject) list.get(position++);
}
@Override
public void remove() {
// do nothing...
}
}
调用者
public class IteratorCaller {
public static void main(String[] args) {
CommonObject co = new MyCommonObject();
for (int i = 0; i < 10; i++) {
co.add("Seq No. : " + i, "This is MyCommonObject(" + i + ")");
}
CommonIterator it = co.iterator();
while (it.hasNext()) {
CommonObject c = (CommonObject) it.next();
c.print();
}
}
}
那么,如何泛型化呢?主要是在Iterator上下手。
import java.util.Iterator;
public interface CommonIterator<E extends CommonObject> extends Iterator<E> {
}
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("all")
public class MyCommonObjectIterator<E extends CommonObject> implements CommonIterator<E> {
private List<CommonObject> list = new ArrayList<CommonObject>();
private int position = 0;
public MyCommonObjectIterator(List<CommonObject> list) {
this.list = list;
}
@Override
public boolean hasNext() {
if (this.position >= list.size() || list.get(position) == null) return false;
return true;
}
@Override
public E next() {
return (E) list.get(position++);
}
@Override
public void remove() {
// do nothing...
}
}
Iterator()方法也会受到影响
import java.util.ArrayList;
import java.util.List;
public class MyCommonObject implements CommonObject {
private List<CommonObject> list = new ArrayList<CommonObject>();
private String name;
private String description;
public MyCommonObject() {}
public MyCommonObject(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public void add(String name, String description) {
this.list.add(new MyCommonObject(name, description));
}
@Override
public void print() {
System.out.println("----------------");
System.out.println("Name: " + this.name + ";\nDescription: " + this.description);
}
@Override
public CommonIterator<CommonObject> iterator() {
return new MyCommonObjectIterator<CommonObject>(this.list);
}
}
调用者
public class IteratorCaller {
public static void main(String[] args) {
CommonObject co = new MyCommonObject();
for (int i = 0; i < 10; i++) {
co.add("Seq No. : " + i, "This is MyCommonObject(" + i + ")");
}
CommonIterator<CommonObject> it = co.iterator();
while (it.hasNext()) {
CommonObject c = it.next();
c.print();
}
}
}