迭代器模式

不要只使用具体的类来编程,要优先使用抽象类和接口来编程

角色

  • Aggregate:集合。

定义创建 Iterator 角色的接口。

  • ConcreteAggrate:具体集合类。

负责实现 Aggragate 所定义的接口。

  • Iterator:迭代器。

定义按顺序逐个遍历元素的接口(API)。包括 hasNext 和 next 两个方法。

  • ConcreteIterator:具体迭代器。

负责实现 Iterator 所定义的接口(API)

实现方法

Aggregate

public interface Aggregate {
    public abstract Iterator iterator();
}

Iterator

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

Book(实体类)

public class Book {
    private String name;
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

BookSelf(ConcreteAggregate)

public class BookSelf implements Aggregate {
    private Book[] books;
    private int last = 0;
    public BookSelf(int maxsize) {
        this.books = new Books[maxsize];
    }

    public Iterator iterator() {
        return new BookSelfIterator(this);
    }

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

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

    public int getLength() {
        //return books.length();
        return last;
    }
}

BookSelftIterator(ConcreteIterator)

public class BookSelfIterator implements Iterator {
    private BookSelft bookself;
    private int index;
    public BookSelftIterator(BookSelf bookself) {
        this.bookself = bookself;
        this.index = 0;
    }

    // 判断是否还有下一个元素
    public boolean hasNext() {
        if (index < bookself.getLength()) {
            return true;
        } else {
            return false;
        }
    }

    // 获取当前元素,并指向下一个元素
    public Object next() {
        Book book = bookselft.getBookAt(index);
        index++;
        return book;
    }
}

测试

public class IteratorTest {
    public static void main(String[] args) {
        BookSelf bookself = new BookSelft(3);
        bookself.appendBook(new Book("《平凡的世界》"));
        bookself.appendBook(new Book("《活着》"));
        bookself.appendBook(new Book("《百年孤独》"));
        Iterator it = bookself.iterator();
        while(it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}

注意

容易弄错“下一个”

iterator.next() 含义 returnCurrentElementAndAdvanceToNextPosition(返回当前元素并指向下一个元素)

容易弄错“最后一个”

(boolean) iterator.hasNex() 在返回最后一个元素前会返回 true,但返回最后一个元素后会返回 false。故 hasNext() 直接理解成 “确认 接下来 是否可以调用 next() 方法了”

多个 Iterator

将遍历功能置于 Aggregate 角色之外 时 Iterator 模式的一个特征。根据该特征,可以针对 ConcreteAggragate 编写多个 ConcreteIterator。

N 种迭代器种类

遍历方法 N 种:

  • 既可以从前向后遍历,也可以从后向前遍历( next & previous )
  • 指定下标进行 跳跃式 遍历

无需 deleteIterator

因为在 Java 中,没有被使用的对象会自动被 GC。

你可能感兴趣的:(迭代器模式)