研磨設計模式之迭代器
阿新 • • 發佈:2018-11-01
聚合
指一組物件的組合結構,如Java中的集合、陣列等
迭代器模式
提供一種方法,順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示
目標
以一個統一的方式來訪問內部實現不同的聚合物件
示例程式碼
- 迭代器介面
/**
* 迭代器介面,定義訪問和遍歷元素的操作
*
*/
public interface Iterator {
/**
* 移動到聚合物件的第一個位置
*/
public void first();
/**
* 移動到聚合物件的下一個位置
*/
public void next();
/**
* 判斷是否已經移動到聚合物件的最後一個位置
* @return true表示已經移動到聚合物件的最後一個位置
* false 表示還沒有移動到聚合物件的最後一個位置
*/
public boolean isDone();
/**
* 獲取迭代的當前元素
* @return 迭代的當前元素
*/
public Object currentItem();
}
- 聚合物件的介面
/**
* 聚合物件的介面,定義建立相應迭代器物件介面
*
*/
public abstract class Aggregate {
/**
* 工廠方法,建立相應迭代器物件的介面
* @return 相應迭代器物件的介面
*/
public abstract Iterator createIterator();
}
- 迭代器實現物件
/**
* 具體的迭代器實現物件,示意的是聚合物件為陣列的迭代器
* 不同的聚合物件,相應的迭代器實現是不一樣的
*/
public class ConcreteIterator implements Iterator{
/**
* 持有被迭代的具體的聚合物件
*/
private ConcreteAggregate aggregate;
/**
* 內部索引,記錄當前被迭代到的索引位置
* -1 表示剛開始的時候,迭代器指向聚合物件第一個元素之前
*/
private int index = -1;
/**
* 構造方法,傳入被迭代的具體的聚合物件
* @param aggregate 被迭代的具體的聚合物件
*/
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public void first() {
index = 0;
}
@Override
public void next() {
if(index < this.aggregate.size()) {
index = index + 1;
}
}
@Override
public boolean isDone() {
if(index == this.aggregate.size()) {
return true;
}
return false;
}
@Override
public Object currentItem() {
return this.aggregate.get(index);
}
}
- 具體的聚合物件
/**
* 具體的聚合物件,實現建立相應迭代器物件的功能
*
*/
public class ConcreteAggregate extends Aggregate{
/**
* 聚合物件的具體內容
*/
private String[] array = null;
/**
* 構造方法,傳入聚合物件具體的內容
* @param array 聚合物件具體的內容
*/
public ConcreteAggregate(String[] array) {
this.array = array;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
/**
* 獲取索引相對應的元素
* @param index 索引
* @return 索引相對應的元素
*/
public Object get(int index) {
Object ret = null;
if(index<array.length) {
ret = array[index];
}
return ret;
}
/**
* 獲取聚合物件的大小
* @return 聚合物件的大小
*/
public int size() {
return this.array.length;
}
}
- 使用示例
String[] names = {"張三","李四","王五","趙六"};
//建立聚合物件
Aggregate aggregate = new ConcreteAggregate(names);
//迴圈輸出聚合物件中的值
Iterator it = aggregate.createIterator();
//首先設定迭代器到第一個元素
it.first();
while(!it.isDone()) {
Object obj = it.currentItem();
System.out.println(obj);
it.next();
}