Java 实现迭代器(Iterator)模式

类图

(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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值