一、Iterator介绍
1、适应设计模式包含Iterator模式和Adaptor模式
2、Iterator模式(迭代器模式)目的: 从含有多个元素的集合中将各个元素逐一取出来,用于在数据集合中按照顺序遍历集合
3、Iterator模式:将循环变量i的抽象化、通用化后形成的模式。
4、注意点:
(1)抽象类和接口弱化了类之间的耦合,使类更加容易作为组件被再次利用(故优先使用接口和抽象类进行编程)
(2)Iterator类中的next方法的作用是返回当前元素,并指向下一个元素。
(3)Iterator类中的hasNext方法:在最后一个元素前返回true,在最后一个元素后返回false
(4)Iterator具体类和Aggregate具体类是一一对应的
(5)注意:没有被使用的对象实例将会自动被删除(垃圾回收、GC),所以不需要删除操作。
5、关系类图(Iterator模式)
二、代码演示
前景:使用迭代器模式遍历书架上的书籍,集合底层使用数组进行。
1、基础类(该类不在类图中)
//JavaBean
//书籍类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
2、Aggregate角色
//集合接口
//Aggregate角色(集合)
public interface Aggregate {
//生成迭代器对象
public abstract Iterator iterator();
}
3、ConcreteAggregate角色
//书架------书的集合
//ConcreteAggregate角色(具体的集合)
public class BookShelf implements Aggregate{
private Book[] books;
private int last=0;
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}
//获得某个位置的书
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);
}
}
4、Iterator角色
//迭代器接口
//Iterator角色(迭代器)
public interface Iterator {
//是否存在下一个元素
public abstract boolean hasNext();
//返回当前集合的一个元素,并且移到后一个元素上
public abstract Object next();
}
5、ConcreteIterator角色
//ConcreteIterator角色(具体的迭代器)
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>=0&&index<bookShelf.getLength()) {
return true;
}
return false;
}
@Override
public Object next() {
Book book=bookShelf.getBookAt(index);
index++;
return book;
}
}
6、Iterator模式测试类
public class IteratorPatternArrayListTest {
public static void main(String[] args) {
BookShelfArrayList list=new BookShelfArrayList(5);
Book book1=new Book("图解设计模式");
Book book2=new Book("深入分析JavaWeb");
Book book3=new Book("Java高并发实战");
list.appendBook(book1);
list.appendBook(book2);
list.appendBook(book3);
Iterator iterator=list.iterator();
while(iterator.hasNext()) {
Book book=(Book)iterator.next();
System.out.println("书名:"+book.getName());
}
}
}
三、增加新的实现()
前景:使用迭代器模式遍历书架上的书籍,集合底层使用ArrayList进行。
1、ConcreteAggregate角色
//书架------书的集合
//ConcreteAggregate角色(具体集合)
public class BookShelfArrayList implements Aggregate{
private ArrayList<Book>arrays;
public BookShelfArrayList(int maxSize) {
this.arrays = new ArrayList<>(maxSize);
}
//获得某个位置的书
public Book getBookAt(int index) {
return arrays.get(index);
}
//在末尾添加一本书
public void appendBook(Book book) {
this.arrays.add(book);
}
public int getLength() {
return arrays.size();
}
@Override
public Iterator iterator() {
return new BookShelfIteratorArrayList(this);
}
}
2、ConcreteIterator角色
//ConcreteIterator角色(具体的迭代器)
public class BookShelfIteratorArrayList implements Iterator{
private BookShelfArrayList list;
private int index;
public BookShelfIteratorArrayList(BookShelfArrayList list) {
this.list=list;
this.index=0;
}
@Override
public boolean hasNext() {
if(index>=0&&index<list.getLength()) {
return true;
}
return false;
}
@Override
public Object next() {
Book book=list.getBookAt(index);
index++;
return book;
}
}
3、对应的测试类
public class IteratorPatternArrayListTest {
public static void main(String[] args) {
BookShelfArrayList list=new BookShelfArrayList(5);
Book book1=new Book("图解设计模式");
Book book2=new Book("深入分析JavaWeb");
Book book3=new Book("Java高并发实战");
list.appendBook(book1);
list.appendBook(book2);
list.appendBook(book3);
Iterator iterator=list.iterator();
while(iterator.hasNext()) {
Book book=(Book)iterator.next();
System.out.println("书名:"+book.getName());
}
}
}
转载请声明出处,谢谢。