介紹:
迭代器模式屬于行為型模式弄屡。它提供一種方法順序訪問一個聚合對象中各個元素泞边,而又不暴露該對象的內(nèi)部表示吞加。
類圖:
Iterator(迭代器接口):定義勺卢、訪問和遍歷元素的接口
ConcreteIterator(具體迭代器類):實現(xiàn)迭代器接口伙判,并記錄遍歷的當(dāng)前位置
Aggregate(容器接口):提供創(chuàng)建具體迭代器角色的接口
ConcreteAggregate(具體容器類):實現(xiàn)容器接口功能
用法:
? 遍歷一個集合對象的時候
個人理解:
這個模式比較古老,很多語言也會自帶這種模式黑忱,比如Java中的List宴抚、Map、數(shù)組等也已經(jīng)封裝了這種方法了甫煞。實際開發(fā)中我們已經(jīng)不會再使用這個模式了菇曲。for循環(huán)、foreach循環(huán)已經(jīng)很滿足我們的開發(fā)需求了抚吠。
例子:
這種模式的學(xué)習(xí)價值還是很高的羊娃,我們就過一遍如何使用這個模式。
需求:實現(xiàn)迭代器
1埃跷、定義Iterator接口
public interface Iterator<T> {
//是否有下一個元素
boolean hasNext();
//返回當(dāng)前位置元素并將位置移到下一位
T next();
}
此接口用于統(tǒng)一業(yè)務(wù)層的抽象方法蕊玷。幫助集合對象遍歷的時候不暴露該對象的內(nèi)部表示。
2弥雹、實現(xiàn)ConcreteIterator類
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list = new ArrayList<>();
private int cursor = 0;
public ConcreteIterator(List<T> list){
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public T next() {
T obj = null;
if (this.hasNext()){
obj = this.list.get(cursor++);
}
return obj;
}
}
為了方便操作垃帅,我們集合對象的數(shù)組用List表示,原則上是用Object[]剪勿。在Iterator接口中的方法贸诚,遍歷時業(yè)務(wù)層只關(guān)注:有沒有后面一個hasNext()
、獲得的元素是什么next()
,而具體實現(xiàn)的細(xì)節(jié)就是Iterator做好了酱固。
3械念、定義Aggregate接口
public interface Aggregate<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
此接口創(chuàng)建迭代器,并為集合中的元素對象提供操作方法运悲。
4龄减、實現(xiàn)ConcreteAggregate類
public class ConcreteAggregate<T> implements Aggregate<T>{
private List<T> list = new ArrayList<>();
@Override
public void add(T obj) {
list.add(obj);
}
@Override
public void remove(T obj) {
list.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list);
}
}
Aggregate的核心就是創(chuàng)建一個迭代器,把組裝好的數(shù)據(jù)交給迭代器去遍歷班眯。
5希停、測試與運行結(jié)果
public class Test {
public static void main(String[] args) {
Aggregate<String> a = new ConcreteAggregate<>();
a.add("A");
a.add("B");
a.add("C");
a.add("D");
Iterator<String> i = a.iterator();
while (i.hasNext()){
System.out.println(i.next());
}
}
}
運行結(jié)果:
A
B
C
D
總結(jié):
迭代器模式分離了對象的遍歷行為,抽象出一個迭代器類來負(fù)責(zé)署隘,這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu)宠能,又可以讓外部代碼透明地訪問集合內(nèi)部數(shù)據(jù)。
感謝您的閱讀~
轉(zhuǎn)載請注明出處喔:http://www.reibang.com/p/27cfcdfb776c
推薦閱讀
基礎(chǔ)篇:
設(shè)計模式前篇之——UML類圖必會知識點
設(shè)計模式前篇之——一起過一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡易理解設(shè)計模式之:簡單工廠模式——來試試接入支付功能
簡易理解設(shè)計模式之:工廠方法模式——數(shù)據(jù)存儲例子
簡易理解設(shè)計模式之:抽象工廠模式——更換數(shù)據(jù)庫例子
簡易理解設(shè)計模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡易理解設(shè)計模式之:原型模式——深磁餐、淺拷貝的概念
簡易理解設(shè)計模式之:單例模式——單例模式的幾種常用寫法
結(jié)構(gòu)型模式:
簡易理解設(shè)計模式之:適配器模式——Android列表視圖控件設(shè)計方式
簡易理解設(shè)計模式之:橋接模式——穿衣服經(jīng)典案例2
簡易理解設(shè)計模式之:組合模式——實現(xiàn)View中的樹狀結(jié)構(gòu)
簡易理解設(shè)計模式之:裝飾模式——穿衣服經(jīng)典案例
簡易理解設(shè)計模式之:外觀模式——第三方SDK的幫助類
簡易理解設(shè)計模式之:享元模式——五子棋游戲例子
簡易理解設(shè)計模式之:代理模式——iOS視圖控件設(shè)計方式
行為型模式:
簡易理解設(shè)計模式之:策略模式——優(yōu)化一下支付功能
簡易理解設(shè)計模式之:模板方法模式——Android中的BaseActivity基類
簡易理解設(shè)計模式之:觀察者模式——監(jiān)聽與回調(diào)
簡易理解設(shè)計模式之:狀態(tài)模式——優(yōu)化登錄操作
簡易理解設(shè)計模式之:備忘錄模式——Word文檔的工作原理
簡易理解設(shè)計模式之:迭代器模式——遍歷對象的好幫手
簡易理解設(shè)計模式之:命令模式——實現(xiàn)命令的參數(shù)化配置
簡易理解設(shè)計模式之:責(zé)任鏈模式——OA中請假流程示例
簡易理解設(shè)計模式之:中介者模式——多人聊天室例子
簡易理解設(shè)計模式之:解釋器模式——語言和文法
簡易理解設(shè)計模式之:訪問者模式——員工考核例子