《图解设计模式》读书笔记1-1 Iterator模式

迭代器模式的类图

类图的解释

名称 说明
Aggregate 集合接口,有提供迭代器的方法
Iterator 迭代器接口,提供迭代操作
BookShelf 书架类
Book 书类
BookShelfIterator 书架类的迭代器

迭代器模式的代码

//集合接口
public interface Aggregate {
    //生成迭代器的方法
    public abstract Iterator iterator();
}

//迭代器接口
public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

//书架类
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 this.books[index];
    }
    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }
    public int getLength() {
        return last;
    }
    //获得BookShelf迭代器
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

//书类
public class Book {
    private String name;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

//书架迭代器类
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;
    }
}


//测试方法
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 = bookShelf.iterator();
        while (iterator.hasNext()) {
            Book book = (Book)iterator.next();
            System.out.println(book.getName());
        }
}

解释

  • BookShelf相当于一个Book的集合,Aggregate接口相当于“集合操纵工具”的工具箱,BookShelf实现了Aggregate接口,就可以从工具箱里面取出集合操纵工具。

  • Iterator是集合的遍历工具,BookShelfIterator实现Iterator接口,就拥有了遍历集合的能力,经过特殊化修改,成为专门遍历BookShelf的工具。

  • 这样,我们就可以从BookShelf中取得Book集合遍历工具BookShelfIterator,使用它遍历这个BookShelf了。

原因

  • 既然是遍历一个集合,直接写一个for循环不就行了,为什么要搞这么麻烦?

  • 因为:集合可以是一个数组,也可以是一个Vector,还可以是一个list,每种的遍历方式都不一样。如果要把数组换成list来用,那么整套代码都得重写。而用了迭代器模式后,只需要改变具体的迭代方法的实现即可。

思想

  • 将通用的方法与具体的实现分离。

  • 弱化类之间的耦合,使类作为组件更容易被复用。

  • 尽量避免用具体的类来编程,优先使用抽象类和接口。

  • 说白了,写代码不要写的太具体,要抽象些...改着也好改。

猜你喜欢

转载自www.cnblogs.com/qianbixin/p/10992670.html
今日推荐