- 迭代器模式的设计如下

- 核心:congtainer的实现和container的迭代(interator)是分开的
package design_model;
import java.util.Iterator;
class Book{
private String name;
Book(String name){
this.name = name;
}
public String getName() {
return name;
}
}
class BookSelf {
private Book[]books;
private int lastIndex=0;
BookSelf(int maxSize){
books = new Book[maxSize];
}
public Book getBookByIndex(int index){
return books[index];
}
public void addBook(Book book){
books[lastIndex]=book;
lastIndex++;
}
public int getSize(){
return lastIndex;
}
public Iterator iterator(){
return new BookSelfIterator(this);
}
}
class BookSelfIterator implements Iterator{
private BookSelf bookSelf;
private int index;
BookSelfIterator(BookSelf bookSelf){
this.bookSelf = bookSelf;
index = 0;
}
@Override
public boolean hasNext() {
if(index<bookSelf.getSize()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
Book book = bookSelf.getBookByIndex(index);
index+=1;
return book;
}
}
public class Iterator_model {
public static void main(String[] args) {
BookSelf bookSelf = new BookSelf(4);
bookSelf.addBook(new Book("1 book"));
bookSelf.addBook(new Book("2 book"));
bookSelf.addBook(new Book("3 book"));
bookSelf.addBook(new Book("4 book"));
Iterator iterator = bookSelf.iterator();
while(iterator.hasNext()){
Book next = (Book)iterator.next();
System.out.println(next.getName());
}
}
}
- 迭代器设计模式可以让可迭代对象的具体实现(即BookSelf)和业务迭代的逻辑(while(iterator.hasNext)…)分开。(将存储数据和遍历数据的职责分离。)
- 即如果我Bookself底层不用数组实现,而是用链表或者arraylist做,我只需调整(BookSeft找元素和遍历元素)的逻辑。
- 而具体迭代器的实现逻辑不需要改变,即BookSelfIterator不需要改变,业务上使用iterator也不需要改变,即下面的迭代代码也不需要改:
while(iterator.hasNext()){
Book next = (Book)iterator.next();
System.out.println(next.getName());
}
下面我把bookself底层换成arraylist做一遍
package design_model;
import java.util.ArrayList;
import java.util.Iterator;
class Book{
private String name;
Book(String name){
this.name = name;
}
public String getName() {
return name;
}
}
class BookSelf {
private ArrayList<Book> books;
private int lastIndex=0;
BookSelf(int maxSize){
books = new ArrayList<>(maxSize);
}
public Book getBookByIndex(int index){
return books.get(index);
}
public void addBook(Book book){
books.add(book);
lastIndex++;
}
public int getSize(){
return lastIndex;
}
public Iterator iterator(){
return new BookSelfIterator(this);
}
}
class BookSelfIterator implements Iterator{
private BookSelf bookSelf;
private int index;
BookSelfIterator(BookSelf bookSelf){
this.bookSelf = bookSelf;
index = 0;
}
@Override
public boolean hasNext() {
if(index<bookSelf.getSize()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
Book book = bookSelf.getBookByIndex(index);
index+=1;
return book;
}
}
public class Iterator_model {
public static void main(String[] args) {
BookSelf bookSelf = new BookSelf(4);
bookSelf.addBook(new Book("1 book"));
bookSelf.addBook(new Book("2 book"));
bookSelf.addBook(new Book("3 book"));
bookSelf.addBook(new Book("4 book"));
Iterator iterator = bookSelf.iterator();
while(iterator.hasNext()){
Book next = (Book)iterator.next();
System.out.println(next.getName());
}
}
}
- 可以看到我只是修改了bookself的定位元素和迭代的逻辑,具体的迭代器逻辑BookSelfIterator没有动过。代码一样是正常的。
总结
- 迭代器模式可以让我们封装一切可以遍历集合,提供统一的遍历方式。无论你底层是数组,链表,arraylist,vector等等,我下面的迭代代码始终一致:
while(iterator.hasNext()){
Book next = (Book)iterator.next();
System.out.println(next.getName());
}