设计模式-迭代器模式
迭代器接口,至少需要两个方法:hasNext、next:
package com.javaxiang.pattern.iterator;
/**
* @author Created by li'xiang on 2021/12/27 17:44
*/
public interface Iterator<E> {
/**
* 是否有元素
*/
boolean hasNext();
/**
* 返回下一个元素
*/
E next();
}
一个集合类,我们以遍历书架 BookShelf 上的书籍 Book 来举例
Book类:只有一个属性:书名
package com.javaxiang.pattern.iterator;
/**
* @author Created by li'xiang on 2021/12/27 17:46
*/
public class Book {
private String name;
public String getName() {
return name;
}
public Book(String name) {
this.name = name;
}
}
书架类 BookShelf 需要持有书籍 Book 的引用,并且实现 Iterator 接口
package com.javaxiang.pattern.iterator;
/**
* @author Created by li'xiang on 2021/12/27 17:47
*/
public class BookShelf implements Iterator<Book> {
private Book[] books;
private int index, last;
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}
public void addBook(Book book){
this.books[last++] = book;
}
/**
* 是否有元素
*/
@Override
public boolean hasNext() {
return index < last;
}
/**
* 返回下一个元素
*/
@Override
public Book next() {
return this.books[index++];
}
}
测试类:
package com.javaxiang.pattern.iterator;
import lombok.extern.slf4j.Slf4j;
/**
* @author Created by li'xiang on 2021/12/27 18:13
*/
@Slf4j
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(5);
bookShelf.addBook(new Book("西游记"));
bookShelf.addBook(new Book("三国演义"));
bookShelf.addBook(new Book("红楼梦"));
bookShelf.addBook(new Book("水浒传"));
while (bookShelf.hasNext()){
Book book = bookShelf.next();
log.info("book name = {}", book.getName());
}
}
}
测试结果:
18:38:46.245 [main] INFO com.javaxiang.pattern.iterator.Main - book name = 西游记
18:38:46.248 [main] INFO com.javaxiang.pattern.iterator.Main - book name = 三国演义
18:38:46.248 [main] INFO com.javaxiang.pattern.iterator.Main - book name = 红楼梦
18:38:46.248 [main] INFO com.javaxiang.pattern.iterator.Main - book name = 水浒传