设计模式--迭代器模式


iterator 模式

iterator 模式是一种行为型设计模式,用于提供一种按顺序访问集合对象元素的方式,不需要暴露其内部的表示方式。

1. java 和 c# 的迭代器,java 和C# 中都提供了内置的迭代器模式,通过Iterator 接口或者使用yield 关键字来方便遍历集合对象。

List<String>  list = new ArrayList<>();
list.add("Item1");
list.add("Item2");
list.add("Item3");

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String item = it.next();
    System.out.println(item);
}

2.c++ STL 中的迭代器 vector

实现自己的迭代器 (书架遍历书籍)

  1. 首先创建一个集合接口和一个遍历接口 aggregate 和 iterator 。
    public interface Aggregate {
        public abstract Iterator iterator();
    }

    public interface Iterator {
        public abstract boolean hasNext();
        public abstract Object next(); //返回当前元素,并指向下一个元素。
    }
  1. 创建一个基本对象 Book 。
    public class Book{
        private String name;
        public Book(String name){
            this.name = name;
        }
        public String getName(){
            return this.name;
        }
    }
  1. 基于接口aggregate 实现一个书架BookShelf,基于接口iterator 实现书架的从前往后的遍历方式 bookShelfIterator。
    public class BookShelf implements Aggregate{
        private Book[] books;
        private int last = 0;
        public BookShelf(int maximum){
            this.books = new Book(maximum);
        }
        public Book getBookAt(int index)
        {
            return books[index];
        }
        public void appendBook(Book book)
        {
            this.books[last] = book;
            last++;
        }
        public int getLength(){
            return last;
        }

        @Override
        public Iterator iterator(){
            return new BookShelfIterator(this);
        }
    }

public class BookShelfIterator implements Iterator{
    private BookShelf bookShelf;
    private int index;
    public BookShelfIterator(BookShelf bookShelf)
    {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    @Override 
    public boolean hasNext(){
        if(index < bookShelf.getLength())
        {
            return true;
        }
        return false;
    }
    @Override
    public Object next(){
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}
  1. 最后实现调用。
public class main {
    public static void main(String[] args){
        BookShelf bookShelf  = new BookShelf(4);
        bookShelf.appendBook(new Book("Android"));
        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());
        }

    }
}