设计模式之迭代模式
迭代模式是设计模式中较为简单的一种设计模式
文章目录
一、什么是迭代(Iterator)模式
迭代器模式:在java的for循环中,我们经常会使用循环变量,借此来遍历数组,比如说经常用到的变量i。i在每次循环后都会自增或自减,这样就实现了对数组的遍历。我们将循环变量i的作用抽象化,通用化后形成的模式称为迭代(Iterator)模式。
1.Iterator(迭代器):负责定义按顺序逐个遍历元素的API。
2.ConcreteIterator(具体的迭代器):负责定义实现Iterator角色所定义的API。
3.Aggregate(集合):负责定义创建Iterator角色的API。
4.ConcreteAggregate(具体的集合):负责实现Aggregate所定义的API。
二、具体实例
我们使用书(Book)与书架(BookShelf)的关系来探索迭代模式。
具体过程是将书放到书架中,然后取书。
1.定义Book类
代码如下:
package com.wwh.iterator_model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private String name;
}
2.定义Iterator(迭代器)与Aggregate(集合)接口
Iterator:
package com.wwh.iterator_model;
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
Aggregate:
package com.wwh.iterator_model;
public interface Aggregate {
public abstract Iterator iterator();
}
3.定义BookShelf类(相当于ConcreteAggregate)
代码如下:
package com.wwh.iterator_model;
import java.util.ArrayList;
import java.util.List;
public class BookShelf implements Aggregate{
List<Book> books = null;
BookShelf(int initialsize){
books = new ArrayList<>(initialsize);
}
public Book getBookAt(int index){
return (Book)books.get(index);
}
public void appendBook(Book book){
books.add(book);
}
public int getLength(){
return books.size();
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
4.定义BookShelfIterator(相当于ConcreteIterator)
代码如下:
package com.wwh.iterator_model;
import java.util.ArrayList;
import java.util.List;
public class BookShelfIterator implements Iterator{
private BookShelf bookShelf;
private int index;
private List<Book> bookList;
BookShelfIterator(BookShelf bookShelf){
this.bookShelf = bookShelf;
this.bookList = bookShelf.books;
this.index = 0;
}
@Override
public boolean hasNext() {
if (index < bookList.size()){
return true;
}
return false;
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
三、实例分析
如上图所示,BookShelf是具体的集合,可以完成取书,放书,查总数;BookShelfIterator是具体的迭代器,用来遍历BookShelf,其中的hasNext和next方法就是完成迭代的方法。通过hasNext判断是否还有书,使用next拿到下一本书。
结果+测试
package com.wwh.iterator_model;
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("安徒生童话"));
bookShelf.appendBook(new Book("伊索寓言"));
bookShelf.appendBook(new Book("灰姑娘"));
bookShelf.appendBook(new Book("白雪公主"));
Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()){
System.out.println(((Book)iterator.next()).getName());
}
System.out.println("--------------------------------------");
System.out.println(((Book)bookShelf.getBookAt(2)).getName());
}
}