• 欢迎访问 winrains 的个人网站!
  • 本网站主要从互联网整理和收集了与Java、网络安全、Linux等技术相关的文章,供学习和研究使用。如有侵权,请留言告知,谢谢!

图解设计模式(1):Iterator模式(一个一个遍历)

设计模式 winrains 1年前 (2019-09-19) 31次浏览

Iterator模式用于在数据集合中按照顺序遍历集合。

1 Iterator模式类图

2 Iterator模式中的角色

  • Iterator(迭代器)

该角色负责定义按顺序逐个遍历元素的接口,对应上图中的Iterator接口。它定义了hasNext和next两个方法。其中,hasNext方法用于判断是否存在下一个元素,next方法则用于获取该元素。

  • ConcreteIterator(具体的迭代器)

该角色负责实现Iterator角色所定义的接口,它包含了遍历集合所必需的信息。

  • Aggregate(集合)

该角色负责定义创建Iterator角色的接口。这个接口是一个方法,会创建具体的Iterator对象(ConcreteIterator对象)。

  • ConcreteAggregate(具体的集合)

该角色负责实现Aggregate角色所定义的接口。它会创建出具体Iterator角色,即ConcreteIterator角色。

3 示例程序

3.1 示例程序类和接口一览表

名字 说明
Aggregate 表示集合的接口
Iterator 遍历集合的接口
Book 表示书的类
BookShelf 表示书架的类
BookShelfIterator 遍历书架的类
Main 测试程序行为的类

3.2 示例程序类图

3.3 示例代码

Aggregate接口

是所要遍历的集合的接口,实现了该接口的类将成为一个可以保存多个元素的集合。
Aggregate接口中声明的方法只有一个iterator方法,该方法会生成一个用于遍历集合的迭代器。

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 Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

BookShelf类

表示书架的类,实现了Aggregate接口。

public class BookShelf implements Aggregate {
    private Book[] books;
    private int last = 0;
    public BookShelf(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;
    }
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

BookShelfIterator类
实现Iterator接口,用于遍历书架。

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

Main类

测试程序。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy-Long-Legs"));
        Iterator it = bookShelf.iterator();
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}

运行结果

Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs

4 为什么引入此模式

引入Iterator后,可以将遍历与实现分离开来。如下述代码:

while (it.hasNext()) {
    Book book = (Book)it.next();
    System.out.println(book.getName());
}

这里只使用了Iterator的hasNext方法和next方法,并没有调用BookShelf的方法。也就是说,这里的while循环并不依赖于BookShelf的实现。

摘自《图解设计模式》


版权声明:文末如注明作者和来源,则表示本文系转载,版权为原作者所有 | 本文如有侵权,请及时联系,承诺在收到消息后第一时间删除 | 如转载本文,请注明原文链接。
喜欢 (1)