设计模式学习笔记(1)-迭代器模式

最近在看设计模式,今天看的是迭代器Iterator模式,在Java容器部分用的比较多。

个人认为迭代器模式的最大优点在于对使用者隐藏了细节,使遍历,删除等一些操作比较容易。

迭代器模式实现的要点:

1.创建Iterator及Iteratable接口。

2.创建ConcreteIterable类,实现Iterable接口去提供创建Iterator对象的方法。

3.创建ConcreteIterator类,实现Iterator接口去实现hasNext(),next()方法。

下面是我自己参考书本写的一个实验代码:

public interface Iterator<T> {
    boolean hasNext();
    T next();
}
public interface Iterable<T> {
    Iterator<T> iterator();
}

public class Book {
    private String name = "";
    public Book(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}
public class BookShelf implements Iterable<Book>{
    private Book[] books;
    private int last = 0;
    public BookShelf(int maxSize){
        books = new Book[maxSize];      
    }

    @Override
    public Iterator<Book> iterator() {
        return new BookShelfIterator();
    }

    private Book getBookAt(int index) {
        return books[index];
    }
    
    public void appendBook(Book book) {
        books[last] = book;
        last++;
    }
    
    private int getLength(){
        return last;
    }
    
    class BookShelfIterator implements Iterator<Book> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < getLength(); 
        }

        @Override
        public Book next() {
            Book book = getBookAt(index);
            index++;
            return book;
        }
        
    }

}

public class Test {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(100);
        bookShelf.appendBook(new Book("Algortihm"));
        bookShelf.appendBook(new Book("The C programing language"));
        bookShelf.appendBook(new Book("Programmer"));
        bookShelf.appendBook(new Book("Design Patterns"));
        Iterator<Book> iterator = bookShelf.iterator();
        while(iterator.hasNext()) {
            Book book = iterator.next();
            System.out.println(book.getName());
        }       
    }
}

需要注意的是next()方法并不是返回下一个元素,而是返回当前的元素,并调整指针位置使其指向下一个元素,创建好Iterator后调用next返回的是第一个元素。

 

posted @ 2013-12-11 23:48  adgkns  阅读(136)  评论(0编辑  收藏  举报