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
实现自己的迭代器 (书架遍历书籍)
- 首先创建一个集合接口和一个遍历接口 aggregate 和 iterator 。
public interface Aggregate {
public abstract Iterator iterator();
}
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next(); //返回当前元素,并指向下一个元素。
}
- 创建一个基本对象 Book 。
public class Book{
private String name;
public Book(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
- 基于接口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;
}
}
- 最后实现调用。
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());
}
}
}