面向对象设计模式_01_Iterator模式
迭代器(Iterator)模式,顾名思义就是一个一个遍历。如果具象化、特殊化成最简单的例子,可以把for循环之中的循环变量 i 的作用当成Iterator模式的一种表现形式。
for( int i = 0; i < arr.length; i++){
System.out.println( arr[i] );
}
Iterator模式的作用
用于在数据集合对象中按照顺序遍历集合中的各个元素,而又不暴露其内部的表示。将遍历与现实分离开来,以此来降低类之间的耦合程度,但是又不影响聚合程度,进而使得类更加容易作为组件被再次利用。
Iterator模式图解
Iterator模式中的角色
- Iterator(抽象迭代器):该角色负责 定义接口(API),用于按顺序逐个遍历元素。定义了两个最基本的方法:hasNext方法 和 next方法,其中hasNext方法用于判断是否存在下一个元素;next方法有两个作用:将指向当前元素的 index 指向下一个元素,同时获取该元素。
- Aggregate(抽象集合):该角色负责创建 Iterator角色的接口(API),这个被创建的接口(API)是一个iterator方法,用于创建出“按顺序访问保存在我内部元素的角色”。由于遍历功能被置于Aggregate角色外,一个Aggregate可以生成多个Iterator来进行遍历。
- ConcreteIterator(具体的迭代器):该角色负责实现Iterator角色定义的接口(iterator角色是抽象的),包含了遍历集合所必需的信息(包括了一个ConcreteAggregate类作为字段,以及一个index字段用来标记遍历所指向的元素)。
- ConcreteAggregate(具体的集合):该角色负责实现Aggregate角色定义的接口,所以会创建出具体的Iterator角色(ConcreteIterator),用于遍历自身。
Iterator模式类图
Iterator模式_示例程序
情节:图书馆现有一批书,需要进行整合分析
需求:将书放置到书架上,并将书的名字按顺序显示出来
示例程序类图:
代码:
1、Aggregate接口
package iterator_rush_Test;
public interface Aggregate {
public abstract Iterator iterator();
}
2、Iterator接口
package iterator_rush_Test;
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
3、Book类
package iterator_rush;
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
4、BookShelf类
package iterator_rush_Test;
public class BookShelf implements Aggregate {
private Book[] books;
private int last = 0;
public BookShelf( int maxSize ) {
this.books = new Book[maxSize];
last = 0;
}
public Book getBookAt( int index ) {
return books[index];
}
public void appendBook( Book book ) {
this.books[last++] = book;
}
public int getLength() {
return last;
}
//重写接口中的iterator方法
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new BookShelfIterator(this);
}
}
5、BoookShelfIterator类
package iterator_rush_Test;
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index = 0;
public BookShelfIterator( BookShelf bookShelf ) {
this.bookShelf = bookShelf;
this.index = 0;
}
//重写接口中的hasNext方法
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if( bookShelf.getLength() > index ) {
return true;
}else {
return false;
}
}
//重写接口中的next方法
@Override
public Object next() {
// TODO Auto-generated method stub
Book book = bookShelf.getBookAt(index);
index ++;//指向下一个元素
return book;
}
}
6、测试
package iterator_rush_Test;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
BookShelf bookShelf = new BookShelf(10);
bookShelf.appendBook( new Book("AAAAAAAA") );
bookShelf.appendBook( new Book("BBBBBBBBB") );
bookShelf.appendBook( new Book("CCCCCCCCCC") );
bookShelf.appendBook( new Book("DDDDDDDDDDD") );
Iterator it = bookShelf.iterator();
while( it.hasNext() ) {
System.out.println( ( (Book)it.next() ).getname() );
}
}
}
7、测试结果
AAAAAAAA
BBBBBBBBB
CCCCCCCCCC
DDDDDDDDDDD