“我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧。”(迭代器闷闷不乐的答应下来。作者吃着小笼包,咂咂嘴道:哼,想偷懒,窗户都没有~)。
正如你们所见,我目前已经没落了,基本上没人会单独写一个迭代器,除非是产品性质的研发,我的定义如下:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.意思呢,就是:提供一种方法,访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
迭代器是为容器服务的,那么什么又是容器呢?所谓容器就是能容纳对象的所有的类型的统称。例如Collection集合类型、Set类型等等,这些在《Thinking in Java》里面的第Chapter 11里面有所介绍,想要深入了解容器的话还需要看Chapter 17,如果没有记错的话应该是这个,好了,继续,我呢,就是为了解决遍历这些容器而诞生的,当然,这些都是JDK1.0.8时代的事情了,现在jdk中早已有了迭代器的实现,所以呐,我也就是个过时的产物~下面上类图先:
我提供了便利容器的方便性,容器只要管理增减就可以了,需要遍历时交给我。下面具体分析类图:
缺点么,还真没有,优点如下:
既然如此的不是很常用,那就直接进行通用代码的实现吧,首先是抽象迭代器:
public interface Iterator{ //遍历下一个元素 public object next(); //是否已经到最后一个元素 public boolean hasNext(); //删除当前指向的元素 public boolean remove(); }
接下来是具体的迭代器实现代码:
public class ConcreteIterator implements Iterator{ private Vector vector = new Vector(); //定义当前游标 public int cursor = 0; @SuppressWarnings("unchecked") public ConcreteIterator(Vector vector){ this.vector = vector; } //判断是否是最后一个 public boolean hasNext(){ if(this.cursor == this.vector.size()){ return false; } else return true; } //返回下一个元素 public Object next(){ Object result = null; if(this.hasNext()){ result = this.vector.get(this.cursor++); } else result = null; return result; } //删除当前元素 public boolean remove(){ this.vector.remove(this.cursor); return true; } }
然后是抽象容器类:
public interface Aggregate{ //是容器必有的元素增加 public void add(Object object); //减少元素 public void remove(Object object); //由迭代器遍历 public Iterator iterator(): }
最后是具体容器的实现类:
public class ConcreteAggregate implements Aggregate{ //容器对象的容器 private Vector vector = new Vector(); //增加一个元素 public void add(Object object){ this.vector.add(object); } //减少一个元素 public void remove(Object object){ this.remove(object); } //返回迭代对象 public void add(Object object){ return new ConcreteIterator(this.vector); } }
以上就是具体的通用方法的实现了。
虽然我这种模式不再使用,但是迭代这种容器却是使用的很频繁的,经常编程的你们想必也见到过很多~下面就来介绍一下具体的使用场合,其实我可以用来: