📜  迭代器模式(1)

📅  最后修改于: 2023-12-03 15:41:56.482000             🧑  作者: Mango

迭代器模式

迭代器模式是一种行为设计模式,它允许客户程序在不暴露集合底层表现形式(列表、栈和树等)的情况下,顺序遍历集合中的所有元素。

迭代器是一个对象,它实现了迭代接口并允许其客户程序逐个访问集合的元素。迭代器保证在迭代过程中不会暴露集合底层表现形式,从而允许更改集合实现方式而不会影响客户代码。

结构

迭代器模式的基本结构包括以下组件:

  • 抽象迭代器Iterator)声明迭代器的通用操作,除了逐个遍历元素之外,还可能有一些移动、获取当前位置等方法。
  • 具体迭代器ConcreteIterator)实现具体的迭代器,维护迭代状态并实现迭代器的接口。
  • 抽象集合Iterable)声明返回迭代器的方法,也就是 createIterator 方法。
  • 具体集合ConcreteIterable)实现返回具体迭代器的 createIterator 方法。

示例

我们来看一个简单的示例,这里使用了迭代器模式以便客户程序可以遍历图书馆中的所有书籍而无需关注其底层数据结构。

首先,我们声明了抽象的迭代器接口:

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

然后,我们声明了抽象的集合接口:

interface Iterable {
    Iterator createIterator();
}

具体的书籍集合实现了迭代器接口并定义了一个嵌套类来实现迭代器。具体集合还需要实现 createIterator 方法,以便客户程序可以获取该集合的迭代器。

import java.util.ArrayList;

class Book {
    private String title;

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

    public String getTitle() {
        return title;
    }
}

class Bookshelf implements Iterable {
    private ArrayList<Book> books;

    public Bookshelf() {
        this.books = new ArrayList<>();
    }

    public void addBook(Book book) {
        books.add(book);
    }

    public Book getBook(int index) {
        return books.get(index);
    }

    public int getLength() {
        return books.size();
    }

    public Iterator createIterator() {
        return new BookshelfIterator(this);
    }

    private class BookshelfIterator implements Iterator {
        private Bookshelf bookshelf;
        private int currentIndex;

        public BookshelfIterator(Bookshelf bookshelf) {
            this.bookshelf = bookshelf;
            this.currentIndex = 0;
        }

        public boolean hasNext() {
            return currentIndex < bookshelf.getLength();
        }

        public Object next() {
            return bookshelf.getBook(currentIndex++);
        }
    }
}

现在,客户程序可以使用迭代器和集合来遍历图书馆中的所有书籍:

public class Main {
    public static void main(String[] args) {
        Bookshelf bookshelf = new Bookshelf();

        bookshelf.addBook(new Book("Design Patterns: Elements of Reusable Object-Oriented Software"));
        bookshelf.addBook(new Book("Clean Code: A Handbook of Agile Software Craftsmanship"));
        bookshelf.addBook(new Book("Cracking the Coding Interview: 189 Programming Questions and Solutions"));

        Iterator bookIterator = bookshelf.createIterator();
        while (bookIterator.hasNext()) {
            System.out.println(bookIterator.next().getTitle());
        }
    }
}
优点
  • 迭代器模式简化了客户程序的代码,客户程序仅需要使用抽象的迭代器接口,无需了解集合对象的具体底层实现。
  • 迭代器模式使得客户程序可以以统一的方式访问不同类型的集合,从而减少了适配不同集合的代码。
缺点
  • 迭代器模式可能会增加代码的复杂度,因为要实现迭代器,需要定义新的接口和类。此外,还需要维护迭代器的状态并确保它正确地管理集合元素。
适用场景
  • 当需要提供一个简单的迭代接口以便客户程序可以逐个访问某个集合对象的元素时,可以使用迭代器模式。
  • 如果需要提供一种访问集合对象的统一方式而且不暴露其底层实现时,可以使用迭代器模式。
总结

迭代器模式是一种简单而又灵活的设计模式,它简化了客户程序的代码并使其可以以统一的方式访问不同类型的集合。该模式可以让客户程序使用迭代器接口来访问集合对象的元素,而无需了解底层实现。虽然迭代器模式可能会增加代码的复杂度,但在需要提供简单的迭代接口和统一的访问方式时,它是非常有用的模式。