Java中的迭代器模式



迭代器模式的本质:

         分离集合对象的遍历行为,抽象出单独的迭代器来负责。

         优点明显:既不暴露内部的数据结构,又可以让外部透明地访问内部的数据。

 

启发:

         不论集合内部的数据如何表示,都可以通过iterator接口完成对内部数据的遍历和访问;这是怎么做到的?

         如下面的例子:其实也没那么难,如果本体不能满足Iterator的需要,可以适当地在本体中增加对应接口。

 

我们还是创建一个实例来说明该特例:

interface Iterator<T>{
	T next();
	boolean hasNext();
}

class MyStack<T>{
	//内部会有一个类来实现上述的Iterator接口;
	private Object[] elements;
	private int size = 0;
	private int capacity;
	
	class StackIterator implements Iterator{	
		private MyStack ms;
		private int nextIndex;
	
		public StackIterator(MyStack ms){
			this.ms = ms;
			nextIndex = ms.getSize();
			//System.out.println("nextIndex = "+nextIndex);
		}
		
		public T next(){
			if(nextIndex >= 0)
				return (T)pick(--nextIndex);
			else
				return null;
		}
		
		public boolean hasNext(){
			return (nextIndex != 0);
		}
	}

	public MyStack(int size){
		capacity = size;
		elements = new Object[size];
	}

	public void push(T element){  //为简单,考虑最简情况;
		elements[size++] = element;
	}
	
	public T pop(){
		return (T) elements[--size];
	}
	
	public int getSize(){ return size;  }
	
	public boolean isEmpty(){
		return (size==0);
	}
	
	public Iterator iterator(){
		return new StackIterator(this);
	}
	
	public T pick(int index){
		return (T)elements[index];
	}
}

public class diedaiqi{

	public static void main(String args[]){
		MyStack<String> ms = new MyStack<String>(10);
		ms.push("abc");
		ms.push("123");
		
		Iterator ii = ms.iterator();
		while(ii.hasNext()){
			System.out.println(ii.next());
		}
			
	}
}

上述的实现中为了配合next的操作,在Stack类中增加pick()方法;上面的方法只提供了nexthasNext()这两种最常用的方法,没有提供其他更复杂的方法,但已经能够说明迭代器的基本工作原理了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值