疊代器模式(Iterator Pattern)
疊代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用于順序通路集合對象的元素,不需要知道集合對象的底層表示。
疊代器模式屬于行為型模式。
介紹
-
:提供一種方法順序通路一個聚合對象中各個元素, 而又無須暴露該對象的内部表示。意圖
-
:不同的方式來周遊整個整合對象。主要解決
-
:周遊一個聚合對象。何時使用
-
:把在元素之間遊走的責任交給疊代器,而不是聚合對象。如何解決
-
:定義接口:hasNext, next。關鍵代碼
-
:JAVA 中的 iterator。應用執行個體
-
:優點
1、它支援以不同的方式周遊一個聚合對象。
2、疊代器簡化了聚合類。
3、在同一個聚合上可以有多個周遊。
4、在疊代器模式中,增加新的聚合類和疊代器類都很友善,無須修改原有代碼。
-
:由于疊代器模式将存儲資料和周遊資料的職責分離,增加新的聚合類需要對應增加新的疊代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。缺點
-
:使用場景
1、通路一個聚合對象的内容而無須暴露它的内部表示。
2、需要為聚合對象提供多種周遊方式。
3、為周遊不同的聚合結構提供一個統一的接口。
-
:疊代器模式就是分離了集合對象的周遊行為,抽象出一個疊代器類來負責,這樣既可以做到不暴露集合的内部結構,又可讓外部代碼透明地通路集合内部的資料。注意事項
實作
我将建立一個叙述導航方法的 Iterator 接口和一個傳回疊代器的 Container 接口。實作了 Container 接口的實體類将負責實作 Iterator 接口。
Main,我的示範類使用實體類 Repository 來存儲想要的資料,其中資料使用的是泛型,内部是通過數組動态擴容存儲資訊的。
步驟 1:建立接口。
Iterator.java
package com.dao.pattern.iterator.interfaces;
/**
* 疊代器接口
*
* @author 阿導
* @version 1.0
* @fileName com.dao.pattern.iterator.interfaces.Iterator.java
* @CopyRright (c) 2018-萬物皆導
* @created 2018-03-28 18:43:00
*/
public interface Iterator<E> {
/**
* 是否有下一個節點
*
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
* @param
* @return boolean
*/
boolean hasNext();
/**
* 擷取下一個節點
*
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
* @param
* @return E
*/
E next();
}
Container.java
package com.dao.pattern.iterator.interfaces;
/**
* 容器
*
* @author 阿導
* @version 1.0
* @fileName com.dao.pattern.iterator.interfaces.Container.java
* @CopyRright (c) 2018-萬物皆導
* @created 2018-03-28 18:47:00
*/
public interface Container<E> {
/**
* 擷取疊代器
*
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
* @param
* @return com.dao.pattern.iterator.interfaces.Iterator<E>
*/
Iterator<E> getIterator();
}
步驟 2:建立實作了 Container 接口的實體類。該類有實作了 Iterator 接口的内部類 RepositoryIterator。
Repository.java
package com.dao.pattern.iterator.core;
import com.dao.pattern.iterator.interfaces.Container;
import com.dao.pattern.iterator.interfaces.Iterator;
/**
* 實作容器的接口
*
* @author 阿導
* @version 1.0
* @fileName com.dao.pattern.iterator.core.Repository.java
* @CopyRright (c) 2018-萬物皆導
* @created 2018-03-28 18:50:00
*/
public class Repository<E> implements Container<E> {
public static final int INIT=0;
/**
* 目前下标
*/
private int index;
/**
* 長度
*/
private int length;
/**
* 元素
*/
private Object[] es;
/**
* 構造方法
*
* @author 阿導
* @time 2018/3/29
* @Co2018/3/29州微财科技有限公司
* @param
*/
public Repository() {
this.index=INIT;
this.length=INIT;
this.es=new Object[INIT];
}
public void add(E e){
//數組動态擴容
Object[] esTemp=new Object[++this.length];
//數組複制
System.arraycopy(es, 0, esTemp, 0, es.length);
//指派
esTemp[es.length]=e;
//改變引用
this.es=esTemp;
}
/**
* 擷取疊代器
*
* @return com.dao.pattern.iterator.interfaces.Iterator<E>
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
*/
@Override
public Iterator<E> getIterator() {
return new RepositoryIterator<E>();
}
class RepositoryIterator<E> implements Iterator<E> {
/**
* 是否有下一個節點
*
* @return boolean
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
*/
@Override
public boolean hasNext() {
if(index<length){
return true;
}
return false;
}
/**
* 擷取下一個節點
*
* @return E
* @author 阿導
* @time 2018/3/28
* @CopyRight 萬物皆導
*/
@Override
public E next() {
if(hasNext()){
return (E) es[index++];
}
return null;
}
}
}
步驟 3:使用 Repository 存儲資料并且擷取疊代器,并列印資料。
Main.java
package com.dao.pattern.iterator.main;
import com.dao.pattern.iterator.core.Repository;
import com.dao.pattern.iterator.interfaces.Iterator;
/**
* 主方法入口
*
* @author 阿導
* @version 1.0
* @fileName com.dao.pattern.iterator.main.Main.java
* @CopyRright (c) 2018-萬物皆導
* @created 2018-03-29 09:30:00
*/
public class Main {
/**
* 主方法入口
*
* @author 阿導
* @time 2018/3/29
* @CopyRight 萬物皆導
* @param args
* @return void
*/
public static void main(String[] args){
Repository<String> repository=new Repository<>();
repository.add("A");
repository.add("B");
repository.add("C");
repository.add("D");
Iterator<String> iterator = repository.getIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
步驟 4:驗證輸出。
A
B
C
D
需要雲伺服器的不要錯過優惠
阿裡雲低價購買雲服務,值得一看