设计模式Iterator

来源:互联网 发布:mac帐号 编辑:程序博客网 时间:2024/05/29 02:12

Java Iterator 设计模式看完之后觉得有点乱,整理下思路。

主要的结构图如下所示:

其中ArrayList,LinkedList等 实现List,Collection接口,Collection 接口中有:add,remove,iterator三个方法,iterator()返回Iterator对象,Iterator本身是个接口,所以返回Iterator对象就是返回接口实现的类的对象,对应上图中的ListIterator(此处容易出错,图中为接口,因为具体的实现一般在每个collection的实现中的内部类实现)。ListIterator中有两个方法待重写:hasNext(),next(),即Iteartor对象有这两个方法。

通常,最终目的是实现对collection中内容的遍历,所以只需要collection知道如何遍历即可,所以iterator接口的实现一般放在collection实现的内部内种实现。所以总结下并对应上图表现为:ArrayList实现接口Collection,List,此接口中有3个方法需要重写:add(),remove(),iterator()。iterator()返回Iterator对象。对象由ArrayList的内部类实现了ListIterator而得到,此接口中有两个方法需要重写:hasNext(),next()。

使用时,可以再写个foreach() 方法,包含iterator方法.测试代码如下:

public class testForeach {   
 public void foreach(IterableString iterator) {   //把iterator的东西都集中放在一起了,使用时直接调用foreach即可。
Iterator it = iterator.iterator();
while (it.hasNext()) {
System.out.print(it.next());//可修改为需要的处理方法
  }}

@Test
public void testForeach() {
  foreach(new IterableString("helo~java~~"));//真正的测试部分
 }}

 具体以上设计模式的框架可参考以下代码(网上的代码运行了,贴过来的):

import java.util.Iterator;

public class IterableString {//相当于图中的arrayList的作用,一个容器,其中只有iterator()方法,没有add,remove
private String orginString;
public IterableString(String orginString) {
super();
this.orginString = orginString;
}
public Iterator iterator() {
return new InnerIterator();
}
private class InnerIterator implements Iterator {//内部类实现iterator,重写了hasNext和next方法。
private int index;
public boolean hasNext() {
return index < orginString.length();
}
public Object next() {
Character c = orginString.charAt(index);
index++;
return c;
}
public void remove() { }
 }}

总结一下,理解起来有点绕,主要就是把hasNext,next拆到Iterator接口中,然后又要让collection来实现这个借口,这样就导致一个容器要分两个不同的层次实现他要用到的4个方法,add,remove直接在collection中实现iteartor()方法只是返回一个iteartor对象,对象调用自身的hasnext,next两个方法实现遍历。其中hasnext,next是iterator对象的方法属性,在实现iterator的ArrayListIterator类中实现(通常用内部类)。

整理完成还是绕啊,虽然知道是怎么回事,愁人。。。