设计模式一:迭代器(Iterator)模式

一、什么是迭代器模式

  说白了就是一种遍历集合中元素的一种设计模式,我们赶紧先来看一下例子

二、实现举例

  这里我们举一个例子,是将书(Book)放置到书架中(BookShelf),一个迭代器,我们总共要写2个接口,分别是一个集合接口(Agreegate),一个迭代器接口(Iterator),两个接口对应的实现类,以及要被遍历的对象对应的类

三、迭代器模式(Iterator)的实现步骤:

1.我们需要有一个集合接口,在这个接口里面定义一个Iterator方法,用于生成遍历集合的迭代器(Iterator)

1 package com.Maxwell07.IteratorMode.bookshelf;
2 
3 /**
4  * 1.定义一个集合接口,用于生成遍历集合的Iterator
5  */
6 
7 public interface Aggregate {
8     public abstract Iterator iterator();
9 }
interface Aggregate

2.写一个Iterator接口,Iterator接口包含hasNext和next的抽象方法

1 package com.Maxwell07.IteratorMode.bookshelf;
2 /**
3  * 2.写一个Iterator接口,Iterator接口包含hasNext和next的抽象方法
4  */
5 
6 public interface Iterator {
7     public abstract boolean hasNext();
8     public abstract Object next();
9 }
interface Iterator

3.写一个要被遍历的类,这里我们写一个Book

package com.Maxwell07.IteratorMode.bookshelf;

public class Book {
    private String name;

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

    public String getName() {
        return name;
    }
}
class Book

4.写一个集合的实现类,这里我们写一个实现了Aggreegate接口的BookShelf,它可以看做是Book的一个集合类

 1 package com.Maxwell07.IteratorMode.bookshelf;
 2 
 3 public class BookShelf implements Aggregate {
 4     private Book[] books;
 5     private int last = 0;
 6 
 7     public BookShelf(int maxSize){
 8         this.books = new Book[maxSize];
 9     }
10     public Book getBookAt(int index){
11         return books[index];
12     }
13 
14     public void appendBook(Book book){
15         this.books[last] =book;
16         last++;
17     }
18 
19     public int getLength(){
20         return last;
21     }
22     //实现接口中的迭代器
23     @Override
24     public Iterator iterator() {
25         return new BookShelfIterator(this);
26     }
27 }
class BookShelf implements Aggregate

5.最后我们再写一个Iterator接口的实现类,也就是集合的迭代器,在这里我们把它命名为BookShelfIterator

package com.Maxwell07.IteratorMode.bookshelf;

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    //判断如果当前的index小于数组的长度,则返回true,否则返回false
    @Override
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    //返回当前索引对应的对象
    @Override
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

6.我们验证一下迭代器

package com.Maxwell07.IteratorMode.bookshelf;

public class Main {
    public static void main(String[] args){
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("三国演义"));
        bookShelf.appendBook(new Book("水浒传"));
        bookShelf.appendBook(new Book("西游记"));
        bookShelf.appendBook(new Book("红楼梦"));
        Iterator iterator = new BookShelfIterator(bookShelf);
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println("书架上有一本:"+book.getName());
        }
    }
}
测试类

  文中的代码链接:https://github.com/Maxwell07/DesignMode/tree/master/src/com/Maxwell07/IteratorMode/bookshelf

四、为什么我们要用迭代器模式?

为了遍历集合,我们引入了一种这么复杂的设计模式,并且在写的时候容易出错,但是我们仔细想一下,引入迭代器以后,实际上我们把实现和遍历分开了,遍历并不会再依赖于实现。正如上面的例子,我们把数组换成集合,main函数中遍历的代买还是不需要再做修改

五、源码中的迭代器模式

//todo 待更新

猜你喜欢

转载自www.cnblogs.com/MarcoLin/p/9346169.html
今日推荐