简介
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
实际应用场景
将书(Book)放到书架(BookShelf)中,并将书名按顺序显示
UML
代码实现
/**
* @author xiaoy
* @since 2021-3-10 9:38
*/
public interface Container<E> {
Iterator<E> iterator();
}
/**
* @author xiaoy
* @since 2021-3-10 9:22
*/
public interface Iterator<E> {
boolean hasNext();
E next();
}
/**
* @author xiaoy
* @since 2021-3-10 9:40
*/
public class BookShelf implements Container<Book> {
private List<Book> books = new ArrayList<>();
@Override
public Iterator<Book> iterator() {
return new BookShelfIterator(this);
}
public int getLength() {
return books.size();
}
public Book getBookByIndex(int index) {
return books.get(index);
}
public void addBook(Book book) {
books.add(book);
}
}
/**
* @author xiaoy
* @since 2021-3-10 9:43
*/
public class BookShelfIterator implements Iterator<Book> {
int index;
private BookShelf bookShelf;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Book next() {
return bookShelf.getBookByIndex(index++);
}
}
/**
* @author xiaoy
* @since 2021-3-10 9:40
*/
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Book setName(String name) {
this.name = name;
return this;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
'}';
}
}
/**
* @author xiaoy
* @since 2021-3-10 9:52
*/
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf();
bookShelf.addBook(new Book("JAVA"));
bookShelf.addBook(new Book("C"));
bookShelf.addBook(new Book("C++"));
bookShelf.addBook(new Book("线性代数"));
bookShelf.addBook(new Book("AI"));
Iterator<Book> iterator = bookShelf.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}