Iterator 模式

wxvirus2022年11月19日
大约 3 分钟

Iterator 模式

一般用于多数据遍历。

在使用 Java 语言显示数组arr元素时,我们大部分时候使用for循环遍历数组

for (int i = 0; i < arr.length; i++) {
   System.out.printlne(arr[i]);
}

将这里的循环变量i的作用抽象化、通用化后形成的模式,在设计模式中成为Iterator模式。Iterator模式用于在数据集合中按照顺序遍历集合。

Demo:将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来

Aggregate接口:是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合。

image-20221105204942011

package demo.bookself;

/**
 * 表示集合的接口
 */
public interface Aggregate {
    public abstract WxIterator iterator();
}

这个接口中声明的方法只有一个iterator的方法,该方法会生成一个用于遍历集合的迭代器。这里我修改了一个迭代器接口的名称为WxIterator用于区分和java已有的

package demo.bookself;

/**
 * 表示遍历集合的接口
 */
public interface WxIterator {
    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     * @return boolean
     */
    public abstract boolean hasNext();

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     * @return Object
     */
    public abstract Object next();
}

WxIterator相当于上面for循环的循环变量,我们定义 2 个方法

  • 判断是否有下一个元素

    这个方法的返回值是boolean,当集合中存在下一个元素时,返回true;当集合中不存在下一个元素时,即已经遍历至集合末尾时,该方法返回falsehasNext方法主要用于循环终止条件。

  • 获取下一个元素,并将迭代器移动到下一个位置。

迭代器接口

package demo.bookself;

/**
 * 表示遍历集合的接口
 */
public interface WxIterator {
    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     * @return boolean
     */
    public abstract boolean hasNext();

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     * @return Object
     */
    public abstract Object next();
}

书架类和书实体类

package demo.bookself;

/**
 * 书的实体类
 */
public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

package demo.bookself;

/**
 * 表示书架的类
 */
public class BookSelf implements Aggregate {

    private Book[] books;
    private int last = 0;

    public BookSelf(int maxsize) {
        this.books = new Book[maxsize];
    }

    public Book getBookAt(int index) {
        return books[index];
    }

    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }

    public int getLength() {
        return last;
    }

    @Override
    public WxIterator iterator() {
        return new BookSelfIterator(this);
    }
}

实现WxIterator的方法

package demo.bookself;

/**
 * 遍历书架的类
 */
public class BookSelfIterator implements WxIterator {
    private BookSelf bookSelf;
    private int index;

    public BookSelfIterator(BookSelf bookSelf) {
        this.bookSelf = bookSelf;
        this.index = 0;
    }

    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     *
     * @return boolean
     */
    @Override
    public boolean hasNext() {
        return index < bookSelf.getLength();
    }

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     *
     * @return Object
     */
    @Override
    public Object next() {
        Book book = bookSelf.getBookAt(index);
        index++;
        return book;
    }
}

测试类

package demo.bookself;

public class Main {
    public static void main(String[] args) {
        BookSelf bookSelf = new BookSelf(4);
        bookSelf.appendBook(new Book("Around the world in 80 days"));
        bookSelf.appendBook(new Book("Bible"));
        bookSelf.appendBook(new Book("Cinderella"));
        bookSelf.appendBook(new Book("Daddy-Long-Legs"));
        WxIterator it = bookSelf.iterator();
        while (it.hasNext()) {
            Book book = (Book) it.next();
            System.out.println(book.getName());
        }
    }
}

Loading...