设计模式 -- Iterator(迭代器)

来源:互联网 发布:类似冰河软件 编辑:程序博客网 时间:2024/05/16 17:22

模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素。

    设计一个容器的接口,用来定义这些能装载任意对象的容器的方法,从而在使用这些容器的时候可以更加灵活,更换起来只需要更改装载的容器的类型即可,其他方法都不用改变。

Ø  接口Collection.java

package com.yilong.designpattern.iterator;

public interface Collection {

 

    public void add(Object obj);

    public int size();

    public Iterator iterator();

}

Ø  实现了Collection接口的ArrayList.java

package com.yilong.designpattern.iterator;

public class ArrayList implements Collection {

   

    Object[] objs = new Object[10];

    int index = 0;

 

    public void add(Object obj) {

       if(index == objs.length) {

           Object[] newObjs = new Object[objs.length * 2];

           System.arraycopy(objs, 0, newObjs, 0, objs.length);

           objs = newObjs;

       }

       objs[index] = obj;

       index ++;

    }

 

    public Iterator iterator() {

       return new ArrayIterator(this);

    }

 

    public int size() {

       return index;

    }

   

    public Object get(int i) {

       return objs[i];

    }

}

    说明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs数组中索引为0-objs.length的元素复制到数组newObjs中,第一个0表示从newObjs0位置开始复制。

    容器的iterator()方法会调用适合本身容器进行遍历的迭代器Iterator

    还需要注意的一点是get(int i)方法不要放在Collection接口的方法定义中,因为Collection接口已经有iterator()方法足以遍历容器中元素了, 可见get(int i)方法并不是每种容器都必须的,因此更加适合于只定义在具体的容器中。

Ø  迭代器接口Iterator.java

package com.yilong.designpattern.iterator;

public interface Iterator {

 

    public boolean hasNext();

    public Object next();

}

    说明:该接口主要有两个方法,一个是判断容器中是否还有下一个元素的hasNext(),另一个是取出容器中下一个元素next()方法。

Ø  实现了Iterator接口的ArrayIterator.java

package com.yilong.designpattern.iterator;

public class ArrayIterator implements Iterator{

    private ArrayList arrayList;

    private int index = 0;

   

    ArrayIterator(ArrayList arrayList) {

       this.arrayList = arrayList;

    }

 

    public boolean hasNext() {

       if(this.index < this.arrayList.size()) {

           return true;

       } else {

           return false;

       }

    }

 

    public Object next() {

       Object obj = arrayList.get(this.index);

       this.index ++;

       return obj;

    }

}

    说明:主要用以对ArrayList容器进行遍历的iterator类。

Ø  Book.java

package com.yilong.designpattern.iterator;

public class Book {

 

    private String bookName;

   

    public Book(String bookName) {

       this.bookName = bookName;

    }

    public String getBookName() {

       return bookName;

    }

    public void setBookName(String bookName) {

       this.bookName = bookName;

    }

}

Ø  Main.java

package com.yilong.designpattern.iterator;

public class Main {

 

    public static void main(String[] args) {

       Collection objList = new ArrayList();

       objList.add(new Book("《名侦探柯南》"));

       objList.add(new Book("《游戏王》"));

       objList.add(new Book("《三国演义》"));

       Iterator iterator = objList.iterator();

       while(iterator.hasNext()) {

           Book book = (Book)iterator.next();

           System.out.println(book.getBookName());

       }

    }

}

    该设计模式的UML图如下:

    说明:JDKIterator与上述的设计原理完全一样,因此测试的代码可以直接copy上述的代码,只需要引入具体的包即可。

Ø  Main.java

package com.yilong.test.jdk.iterator;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

 

public class TestIterator {

 

    public static void main(String[] args) {

       Collection  bookShelfs = new ArrayList();

       bookShelfs.add(new Book("福尔摩斯"));

       bookShelfs.add(new Book("名侦探柯南"));

       bookShelfs.add(new Book("游戏王"));

       System.out.println(bookShelfs.size());

       Iterator bookShelfIterator = bookShelfs.iterator();

       while(bookShelfIterator.hasNext()) {

           Book book = (Book)bookShelfIterator.next();

           System.out.println(book.getName());

       }

      

       ArrayList arrayList = new ArrayList();

       System.out.println(arrayList.get(0));

    }

}

原创粉丝点击