迭代器模式
學到現在漸漸的感覺抓到一點點感覺,那就是學習模式的時候先看定義然後,嘗試理解它,理解目的不管百度還是查資料也好,這樣不管模式有多複雜,但是目的不會變,理解他的思想後就簡單很多。
迭代器模式(Iterator ):提供一種方法順序訪問聚合對象中的每個元素,而不是暴露其內部表示。
迭代器模式的定義並不難理解就是就是遍歷聚合對象中的每個元素,只不過有前提就是了。
class HarryPotterCD{
private List list;
public HarryPotterCD(){
list=new ArrayList();
list.add("哈利·波特與火焰杯");
list.add("哈利·波特與鳳凰社");
list.add("哈利·波特與混血王子");
list.add("哈利·波特與死亡聖器");
}
}
class HarryPotterBook{
private String[] str;
public HarryPotterBook(){
str=new String[7];
str[0]="哈利·波特與魔法石";
str[1]="哈利·波特與密室";
str[2]="哈利·波特與阿茲卡班囚徒";
}
}
上面有一整套哈利波特,但是有三本是書有四季的的電影,要求一起遍歷他們。
首先抽象,然後需要一個迭代器
abstract class HarryPotter{
public abstract Iterator createIterator();
}
interface Iterator{
boolean hasNext();
Object next();
void printAll();
}
然後需要各自的迭代器去遍歷他們
class CDIterator implements Iterator{
private List list;
private int index=0;
public CDIterator(List list){
this.list=list;
}
@Override
public boolean hasNext() {
if(index<=list.size()-1){
return true;
}
return false;
}
@Override
public Object next() {
Object ob=list.get(index);
index++;
return ob;
}
@Override
public void printAll(){
while(hasNext()){
System.out.println(next().toString());
}
}
}
class BookIterator implements Iterator{
private String[] hp;
private int index=0;
public BookIterator(String[] hp){
this.hp=hp;
}
@Override
public boolean hasNext() {
if(index<= hp.length-1){
return true;
}
return false;
}
@Override
public Object next() {
Object ob=hp[index];
index++;
return ob;
}
@Override
public void printAll(){
while(hasNext()){
System.out.println(next().toString());
}
}
}
最後看看測試輸出
public class Client {
public static void main(String[] args){
HarryPotter book=new HarryPotterBook();
HarryPotter CD=new HarryPotterCD();
Iterator it=book.createIterator();
it.printAll();
it=CD.createIterator();
it.printAll();
}
}
輸出的是:
哈利·波特與魔法石
哈利·波特與密室
哈利·波特與阿茲卡班囚徒
哈利·波特與火焰杯
哈利·波特與鳳凰社
哈利·波特與混血王子
哈利·波特與死亡聖器
我還特地跑過去看了下java.util裏面的Iterator、ListIterator、ArrayList的源碼其實思想是一樣的,只不過官方把具體的迭代器寫成內部類放在ArrayList裏面
迭代器的組成:
抽象迭代器(Iterator):所有迭代器都需要實現的接口,提供了遊走聚合對象元素之間的方法。
具體迭代器(ConcreteIterator):利用這個具體的迭代器能夠對具體的聚合對象進行遍歷。每一個聚合對象都應該對應一個具體的迭代器。
抽象聚合類(Aggregate):聚合定義創建相應迭代器對象的接口
具體聚合類 (ConcreteAggregate):實現creatorIterator()方法,返回該聚合對象的迭代器。
UML