二十三设计模式 之 迭代器模式(Iterator)

最近开始看设计模式,随手记下笔记。如有问题,望指正。


  迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

迭代器模式中的角色:
迭代器(Iterator):负责定义按顺序逐个遍历元素的迭代器接口。由Iterator接口扮演,定义了hasNext和next两个方法。hasNext用于判断是否存在下一个元素,next方法则用于获取该元素并移动迭代器。
具体的迭代器(ConcreteIterator):负责实现Iterator角色定义的接口,由BookShelfIterator扮演该角色。包含了遍历集合所必须的信息。
集合(Aggregate):该角色负责定义集合接口,Iterable接口扮演该角色。这个接口是iterator()方法,能创建出自身具体的迭代器角色。
具体的集合(ConcreteAggregate):负责实现Aggregate角色定义的接口,即实现iterator()方法。BookShelf扮演该角色。

 

二十三设计模式 之 迭代器模式(Iterator)_第1张图片

Book类,存储书籍信息。

public class Book {
    //表示书的类,存储书的名字,并重写toString方法
    private String name = null;
    public Book(String name) {
        this.setName(name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return name;
    }
}


书架类,存储Book类,实现了Iterable接口中的iterator方法,即返回一个自身的迭代器。

public class BookShelf implements Iterable{
    private Book[] books = null;
    private int last = 0;
    public BookShelf(int size) {
        books = new Book[size];
    }
    public void addBook(Book book){
        this.books[last] = book;
        last++;
    }
    public Book getBook(int cur){
        return books[cur];
    }
    public int getLenth(){
        return last;
    }
    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}


书架迭代器类,实现了Iterator接口以及hasnext和next方法。存储了BookShelf类的引用,方便获取信息。

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf = null;
    private int index = 0;
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    @Override
    public boolean hasNext() {
        if(index


测试

public class Text {
    public static void main(String[] args) {
        BookShelf bs = new BookShelf(10);
        bs.addBook(new Book("设计模式"));
        bs.addBook(new Book("Java编程思想"));
        bs.addBook(new Book("C++编程"));
        bs.addBook(new Book("Python速成"));
        bs.addBook(new Book("Web网页设计"));
        Iterator it = bs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        for (Book book : bs) {
            System.out.println(book);
        }
    }
}
/*out:
设计模式
Java编程思想
C++编程
Python速成
Web网页设计
设计模式
Java编程思想
C++编程
Python速成
Web网页设计
*/


优点:
1、引入Iterator后可以将遍历与实现分离开来,在遍历时只需调用迭代器的方法,而不用关心具体集合实现类的方法。
2、迭代器简化了集合接口。有了迭代器的遍历接口,集合不再需要类似的接口,也不再关注具体的遍历实现。
3、在同一集合中可以有多个遍历。每个迭代器保持着自己的遍历状态,所以一个集合同时可以进行多个遍历。

参考自《图解设计模式》

你可能感兴趣的:(设计模式,设计模式)