您的位置:首页 > 编程语言 > Java开发

Java设计模式(1)Iterator模式 一个一个遍历

2018-03-02 17:43 681 查看

一、Iterator模式

我们在使用java语言显示数组arr中的元素时,我们可以使用下面这样的for循环语句遍历数组:for(int i = 0; i< arr.length; i++) {
System.out.println(arr[i]);
}请注意这段代码中的循环变量i,该变量的初始值是0,然后会递增为1,2,3,...程序则在每次i递增后都输出arr[i],我们在程序中经常会看到这样的for循环语句。
数组、集合中保存了很多元素,通过指定数组下标,我们可以从中选择任意一个元素。for语句中的i++的作用是让i的值在每次循环后自增1,将这里的循环变量i的作用抽象化,通用化后形成的模式,在设计模式中成为Iterator模式。Iterator模式用户在数据集合中按照顺序遍历集合,单词Iterate有反复做某件事情的意思,汉语成为“迭代器”。

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
使用next()获得序列中的下一个元素。

使用hasNext()检查序列中是否还有元素。

使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

二、示例程序

1.示例程序类图一览表

类名说明
Aggregate.java表示集合的接口                                                            
Iterator.java遍历集合的接口
Book.java表示书本的类
BookShelf.java表示书架的类
BookShelfIterator.java遍历书架的类
Main.java测试示例程序的主类

2.示例程序的类图



3.Aggregate接口

public interface Aggregate {
/**
* 在Aggregate接口中声明的方法只有一个,Iterator方法,该方法会生成一个用于遍历集合的迭代器
* 想要遍历集合中的元素时,可以调用iterator方法来生成一个实现了Iterator接口的类的实例。
* @return
*/
public abstract Iterator iterator();
}

4.Iterator接口

public interface Iterator {
/**
* 声明了二个方法,判断是否存在下一个元素的hasNext方法,和获取下一个元素的next方法。
*
* @return
*/
public abstract boolean hasNext();

public abstract Object next();
}

5.Book类

public class Book {
/**
* Book类中声明一个书名的字段
*/
private String name;

public Book(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

6.BookShelf类

public class BookShelf implements Aggregate {
/**
* BookShelf类是表示书架的类,由于需要将该类作为集合进行处理,因此它实现了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);
}

}

7.BookShelfIterator类

public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;

public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}

public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}

@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}

8.Main类

public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(5);
bookShelf.appendBook(new Book("GONE WITH THE WIND"));
bookShelf.appendBook(new Book("Romeo and Juliet"));
bookShelf.appendBook(new Book("Scarlet and Black"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("David Copperfield"));
Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getName());
}
}
}

9.运行示例程序

GONE WITH THE WIND
Romeo and Juliet
Scarlet and Black
Bible
David Copperfield

三、Iterator模式中的角色

1.Iterator(迭代器)

该角色负责定义按顺序逐个遍历元素的接口,在示例程序中Iterator接口是这个角色,它定义了hasNext和next两个方法,hasNext方法用于判断是否存在下一个元素,next方法则用于获取该元素。

2.ConcreteIterator(具体的迭代器)

该角色负责实现Iterator角色所定义的接口,在示例程序中,BookShelfIterator接口是这个角色。

3.Aggregate(集合)

该角色负责定义创建Iterator角色的接口,这个接口是一个方法,会创建出按顺序访问保存在我内部元素的人,在示例程序中,Aggregate接口是这个角色。

4.ConcreteAggregate(具体的集合)

该角色负责实现Aggregate角色所定义的接口,它会创建出具体的Iterator角色,在示例程序中,BookShelf是这个角色。

5.Iterator模式的类图




新手一枚,欢迎拍砖~ ~ ~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息