类图
(MyIterator实际依赖的是MyCollection)
/**
* 自定义集合接口, 类似java.util.Collection
* 用于数据存储
* @author stone
*
*/
public interface ICollection<T> {
IIterator<T> iterator(); //返回迭代器
void add(T t);
T get(int index);
}
/**
* 自定义迭代器接口 类似于java.util.Iterator
* 用于遍历集合类ICollection的数据
* @author stone
*
*/
public interface IIterator<T> {
boolean hasNext();
boolean hasPrevious();
T next();
T previous();
}
import java.util.Arrays;
/**
* 集合类, 依赖于MyIterator
* @author stone
*/
public class MyCollection<T> implements ICollection<T> {
private T[] arys;
private int index = -1;
private int capacity = 5;
private int realCapacity;
public MyCollection() {
this.arys = (T[]) new Object[capacity];
}
@Override
public IIterator<T> iterator() {
return new MyIterator<T>(this);
}
@Override
public void add(T t) {
index++;
if (index == capacity) {
capacity *= 2;
this.arys = Arrays.copyOf(arys, capacity);
}
this.arys[index] = t;
realCapacity++;
}
@Override
public T get(int index) {
return this.arys[index];
}
private int getCount() {
return realCapacity;
}
private static class MyIterator<T> implements IIterator<T> {
private MyCollection<T> collection;
private int cursor = 0;
MyIterator(MyCollection<T> collection) {
this.collection = collection;
}
@Override
public boolean hasNext() {
if (cursor < collection.getCount()) {
return true;
}
return false;
}
@Override
public boolean hasPrevious() {
if (cursor > 0) {
return true;
}
return false;
}
@Override
public T next() {
return collection.get(cursor++);
}
@Override
public T previous() {
return collection.get(cursor--);
}
}
}
/*
* 迭代器(Iterator)模式 又叫做游标(Cursor)模式
* 提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
* Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据
*
* 若有新的存储结构,可new 一个ICollection, 对应的 new 一个IIterator来实现它的遍历
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class Test {
public static void main(String[] args) {
ICollection<Integer> collection = new MyCollection<Integer>();
add(collection, 3, 5, 8, 12, 3, 3, 5);
for (IIterator<Integer> iterator = collection.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
System.out.println("-------------");
ICollection collection2 = new MyCollection();
add(collection2, "a", "b", "c", 3, 8, 12, 3, 5);
for (IIterator iterator = collection2.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
}
static <T> void add(ICollection<T> c, T ...a) {
for (T i : a) {
c.add(i);
}
}
}
打印
3
5
8
12
3
3
5
-------------
a
b
c
3
8
12
3
5