淺談Java設計模式——迭代器模式(Iterator)
阿新 • • 發佈:2018-12-21
一、概述
給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。
二、使用場景
1.訪問一個聚合物件的內容而無需暴露它的內部表示。
2.支援對聚合物件的多種遍歷。
3.為遍歷不同的聚合結構提供一個統一的介面(即,支援多型迭代)。
三、參與者
1.Iterator 迭代器定義訪問和遍歷元素的介面。
2.ConcreteIterator 具體迭代器實現迭代器介面。 對該聚合遍歷時跟蹤當前位置。
3.Aggregate 聚合定義建立相應迭代器物件的介面。
4.ConcreteAggregate 具體聚合實現建立相應迭代器的介面,該操作返回ConcreteIterator的一個適當的例項.
四、類圖
五、程式碼示例
1.Iterator
/**
* Iterator
* @author zhipeng_Tong
*/
public interface Iterator {
Object next();
Object first();
Object last();
boolean hasNext();
}
2.ConcreteIterator
/** * ConcreteIterator * @author zhipeng_Tong */ public class IteratorImpl implements Iterator { private List list; private int index; public IteratorImpl(List list) { this.list = list; } @Override public Object next() { index++; return list.get(index - 1); } @Override public Object first() { return list.get(0); } @Override public Object last() { return list.get(list.size() - 1); } @Override public boolean hasNext() { return index < list.size(); } }
3.Aggregate
/**
* Aggregate
* @author zhipeng_Tong
*/
public interface List {
Iterator iterator();
Object get(int index);
int size();
void add(Object o);
}
4.ConcreteAggregate
/** * ConcreteAggregate * @author zhipeng_Tong */ public class ListImpl implements List { private Object[] list; private int index; private int size; public ListImpl() { this.list = new Object[100]; this.index = 0; this.size = 0; } @Override public Iterator iterator() { return new IteratorImpl(this); } @Override public Object get(int index) { return list[index]; } @Override public int size() { return this.size; } @Override public void add(Object o) { list[index++] = o; size++; } }
5.測試程式碼
public class Client {
public static void main(String[] args) {
List list = new ListImpl();
list.add("hello");
list.add("word");
list.add("java");
Iterator iterator = list.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
System.out.println("first: " + iterator.first());
System.out.println("last: " + iterator.last());
System.out.println();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
執行結果
hello
word
java
first: hello
last: java
hello
word
java