设计模式——Iterator模式实现研究
生活随笔
收集整理的這篇文章主要介紹了
设计模式——Iterator模式实现研究
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導讀:軟件設計模式是一種表達、記錄和重用軟件設計結構和設計經驗的新方法,它對反復出現的設計結構的關鍵特征進行識別、抽象和命名,使重用成功設計和結構更加容易。本文介紹了軟件設計模式的特點、描述方式以及在設計中使用模式帶來的好處,并就迭代器(Iterator)模式在Java集合框架類(JavaCollectionFramework)中的典型實現為
例,說明此模式的實現方法以及利用此模式帶來的軟件擴充和使用的方便性。Iterator模式就是分離了集合對象的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明的訪問集合內部的數據。
關鍵詞:設計模式,Iterator模式,Java集合框架類
0 引 言
隨著計算機網絡和通信的快速發展和廣泛應用,市場對企業的軟件能力提出了近乎苛刻的要求,提高軟件能力來化解軟件危機已成為軟件業的頭等大事。。構件化和重用是200多年來工業化社會發展的成功經驗,借鑒工業社會發展的成功經驗,確定可行的軟件工業化目標顯得非常重要。構件化和重用是提高軟件能力的必有之路。軟件設計模式是一種表達、記錄和重用軟件設計結構和設計經驗的新方法,它對反復出現的設計結構的關鍵特征進行識別、抽象和命名,使重用成功設計和結構更加容易。軟件設計模式已經成為現代軟件系統設計的重要研究對象。。本文介紹了軟件設計模式的特點、描述方式以及在設計中使用模式帶來的好處,并就迭代器(Iterator)模式在Java集合框架類(Java Collection Framework)中的典型實現為例,說明此模式的實現方法以及利用此模式帶來的軟件擴充和使用的方便性。
1 設計模式
設計模式的思想最初來源于建筑領域,但其中體現的思想也適用于其它領域,例如面向對象軟件設計領域。設計模式關注的是特定設計問題及其解決方案,在每種模式中均描述一個設計問題和一個經過驗證的、通用的解決方案,這個解決方案是對反復出現的設計結構進行識別和抽象得到的,它通常由多個對象組成,模式中不僅描述對象的設計,而且描述對象間的通信。
一個設計模式有四個基本要素:?
模式名稱:一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。
問題(problem):描述應該在何時使用該模式。
解決方案(solution):描述設計的組成成分,它們之間的相互關系及各自的職責和協作方式。
效果(consequences) 描述了模式應用的效果及使用模式 [論文網?www.uuubuy.com]應權衡的問題。模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
根據所解決的問題不同,設計模式可分為創建型模式、結構型模式和行為模式三類。
創建型模式都和如何有效地創建類的實例相關,這些模式使程序能夠根據特定的情況創建特定的類。通過new來創建實例只能夠在程序中生成固定的類。但是在很多情況下,程序需要根據不同的情況生成不同的類的實例,這就需要將實例的生成過程抽象到一個特殊的創建類中,由該類在運行時決定生成哪種類的實例。這樣使得程序有更好的靈活性和通用性。
結構型模式處理類和對象的組合,將類和對象組合起來,以構成更加復雜的結構。它又被劃分為類模式和對象模式。類模式和對象模式之間的區別在于類模式通過繼承關系來提供有效的接口;而對象模式通過對象合成或將對象包含在其它對象中的方式構成更加復雜的結構行為模式,
行為類型的模式主要是那些處理對象之間通訊的模式。它描述類或對象的交互和職責分配,定義對象間的通信和復雜程序中的流控。本文涉及的迭代器(Iterator)模式就是一種行為模式。
2 迭代器模式(Iterator Pattern)
在面向對象的軟件設計中,我們會遇到一類集合對象,這類集合對象的內部結構的實現可能差別很大,但是我們需要關心的只有兩點:一是集合內部的數據存儲結構,二是遍歷集合內部的數據。單一職責原則是面向對象設計的一條重要原則,所以我們要盡可能的去分解這些職責,用不同的類去承擔不同的職責。Iterator模式就是分離了集合對象的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明的訪問集合內部的數據。
迭代器使用的意圖是提供一種方法順序訪問一個集合對象中的各個元素,而又不需要暴露該對象的內部細節。現在的電視機,使用[后一個]和[前一個]按鈕切換頻道。當按下[后一個]按鈕時,將切換到下一個預置的頻道。作為電視機的用戶,當我們改變頻道時,我們關心的不是具體的頻道 ,而是節目內容。如果對一個頻道的節目不感興趣,那么可以換下一個頻道,而不需要知道它是具體是第幾頻道,圖1給出了使用頻道迭代器來選臺的對象圖。 圖1使用選頻器做例子的Iterator模式對象圖 迭代器模式在客戶與容器之間加入了迭代器角色。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向 客戶端暴露集合的內部結構。。客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素)都由Iterator來維護,客戶端從不直接和集合類打交道,它總是控制Iterator,向它發送"向前","向后","取當前元素"的命令,就可以間接遍歷整個集合。
為了使客戶程序從與具體迭代器耦合的困境中脫離出來,避免具體迭代器的更換給客戶程序帶來的修改,迭代器模式抽象了具體迭代器,使得客戶程序更具一般性和重用性。
Iterator模式結構圖如圖2所示下:
圖2 Iterator模式結構圖
從結構上可以看出,迭代器模式由以下角色組成:迭代器角色(Iterator),負責定義訪問和遍歷元素的接口;具體迭代器角色(Concrete Iterator),實現迭代器接口,并要記錄遍歷中的當前位置;容器角色(Container),負責提供創建具體迭代器角色的接口;具體容器角色(Concrete Container),實現創建具體迭代器角色的接口,它與該容器的結構相關。
迭代器角色的加入,就可以很好的避免容器內部細節的暴露,而且也使得設計符合“單一職責原則”。具體迭代器角色和具體容器角色是耦合在一起的,即遍歷算法是與容器的內部細節緊密相關的。
3 Java類庫中Iterator模式實現
Java類庫是設計模式的經典應用,在此以Java類庫中的集合框架類(Java Collection Framework)為例來討論Iterator模式的實現。
在JavaCollection Framework的應用中,遍歷的進程是由客戶程序來控制的,這種實現方式被稱為外部迭代器;它比由迭代器自身來控制迭代的內部迭代器更加靈活、強大。
遍歷算法的實現,表面上看應該在迭代器角色中實現。這樣既便于在一個容器上使用不同的遍歷算法,也便于將一種遍歷算法應用于不同的容器。但是這樣就要求容器角色公開自己的私有屬性,從而破壞掉容器的封裝性。所以遍歷算法被放到容器角色里來實現。這樣遍歷算法便和特定的容器捆綁在一起,迭代器角色僅僅存放 [論文網?www.uuubuy.com]一個遍歷的當前位置。這樣做的另一個好處是對同一個容器對象,可以同時進行多個遍歷。因為遍歷狀態是保存在每一個迭代器對象中的。在Java Collection Framework的應用中,提供的具體迭代器角色是定義在容器角色中的內部類,這樣保護了容器的封裝。同時容器也提供了遍歷算法接口,便于擴展各自的迭代器。
下面給出迭代器模式中的四個角色在JDK5.0中的JavaCollection Framework中所對應的代碼片段,以此來分析迭代器模式如何在Java Collection Framework中實現,圖3給出了我們要分析的基本類的類圖:
圖3 Java Collection Framework中一個基本類圖
1)迭代器角色,接口Iterator,定義了遍歷的接口,?
代碼片段1
public interfaceIterator<E> {
boolean hasNext();
E next();
void remove();
}
2)容器角色,接口List。
3)具體容器角色,實現List接口并繼承抽象類AbstractList的ArrayList類。
4)具體迭代器角色,它是以抽象類AbstractList的內部類的形式出來的。抽象類AbstractList是為了將各個具體容器角色的公共部分提取出來而存在的。
代碼片段2所示的方法iterator()是負責創建具體迭代器角色的工廠方法。
代碼片段2:
publicIterator<E> iterator() {
return new Itr();
}
作為內部類的具體迭代器角色,其類圖如圖4所示,具體實現的代碼如代碼段3所示。
圖4 具體迭代器角色類圖
代碼片段3:?
private class Itrimplements Iterator<E> {
intcursor = 0;
intlastRet = -1;
intexpectedModCount = modCount;
publicboolean hasNext() {
return cursor != size();
}
publicE next() {
checkForComodification();
try {
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor) cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
finalvoid checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
迭代器模式的使用如下面的代碼段4所示,客戶程序要先得到具體容器角色,然后再通過具體容器角色得到具體迭代器角色。這樣便可以使用具體迭代器角色來遍歷容器。
代碼片段4
List<E> [論文網?www.uuubuy.com]?list=new ArrayList <E>();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();//do some businesss logic?
}
4 總結
迭代器模式在應用中使用非常廣泛,它通過抽象出一個負責遍歷行為的迭代器類,來達到既不暴露集合的內部結構,又可讓外部代碼透明的訪問集合內部數據的目標。
在實現自己的迭代器時,要操作的容器必須有相應的接口支持,通過在容器內增加相應的內部迭代器類來實現對具體容器的遍歷,并且還要有創建具體迭代器角色的工廠方法。當然,不同結構的容器角色,其遍歷的含義和實現也有較大差別,特別是當容器中存在復合對象或數據結構復雜時,如何進行深層遍歷以及遍歷的安全性都是值得關注的問題。
[參 考文 獻]
[1](美)GoF。設計模式--可復用的面向對象軟件的基礎,機械工業出版社,2005.?
[2]深入淺出Java設計模式, http://www.cn-java.com.
[3].NET設計模式, http://www.cnblogs.com.
[4]龔波。java設計模式,人民郵電出版社,2007.
[5]饒一梅,王治寶,王秀峰。軟件設計模式及其在Java類庫中的典型實現。[J]計算機工程與應用,2002/4,P48—50.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
關鍵詞:設計模式,Iterator模式,Java集合框架類
0 引 言
隨著計算機網絡和通信的快速發展和廣泛應用,市場對企業的軟件能力提出了近乎苛刻的要求,提高軟件能力來化解軟件危機已成為軟件業的頭等大事。。構件化和重用是200多年來工業化社會發展的成功經驗,借鑒工業社會發展的成功經驗,確定可行的軟件工業化目標顯得非常重要。構件化和重用是提高軟件能力的必有之路。軟件設計模式是一種表達、記錄和重用軟件設計結構和設計經驗的新方法,它對反復出現的設計結構的關鍵特征進行識別、抽象和命名,使重用成功設計和結構更加容易。軟件設計模式已經成為現代軟件系統設計的重要研究對象。。本文介紹了軟件設計模式的特點、描述方式以及在設計中使用模式帶來的好處,并就迭代器(Iterator)模式在Java集合框架類(Java Collection Framework)中的典型實現為例,說明此模式的實現方法以及利用此模式帶來的軟件擴充和使用的方便性。
1 設計模式
設計模式的思想最初來源于建筑領域,但其中體現的思想也適用于其它領域,例如面向對象軟件設計領域。設計模式關注的是特定設計問題及其解決方案,在每種模式中均描述一個設計問題和一個經過驗證的、通用的解決方案,這個解決方案是對反復出現的設計結構進行識別和抽象得到的,它通常由多個對象組成,模式中不僅描述對象的設計,而且描述對象間的通信。
一個設計模式有四個基本要素:?
模式名稱:一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。
問題(problem):描述應該在何時使用該模式。
解決方案(solution):描述設計的組成成分,它們之間的相互關系及各自的職責和協作方式。
效果(consequences) 描述了模式應用的效果及使用模式 [論文網?www.uuubuy.com]應權衡的問題。模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
根據所解決的問題不同,設計模式可分為創建型模式、結構型模式和行為模式三類。
創建型模式都和如何有效地創建類的實例相關,這些模式使程序能夠根據特定的情況創建特定的類。通過new來創建實例只能夠在程序中生成固定的類。但是在很多情況下,程序需要根據不同的情況生成不同的類的實例,這就需要將實例的生成過程抽象到一個特殊的創建類中,由該類在運行時決定生成哪種類的實例。這樣使得程序有更好的靈活性和通用性。
結構型模式處理類和對象的組合,將類和對象組合起來,以構成更加復雜的結構。它又被劃分為類模式和對象模式。類模式和對象模式之間的區別在于類模式通過繼承關系來提供有效的接口;而對象模式通過對象合成或將對象包含在其它對象中的方式構成更加復雜的結構行為模式,
行為類型的模式主要是那些處理對象之間通訊的模式。它描述類或對象的交互和職責分配,定義對象間的通信和復雜程序中的流控。本文涉及的迭代器(Iterator)模式就是一種行為模式。
2 迭代器模式(Iterator Pattern)
在面向對象的軟件設計中,我們會遇到一類集合對象,這類集合對象的內部結構的實現可能差別很大,但是我們需要關心的只有兩點:一是集合內部的數據存儲結構,二是遍歷集合內部的數據。單一職責原則是面向對象設計的一條重要原則,所以我們要盡可能的去分解這些職責,用不同的類去承擔不同的職責。Iterator模式就是分離了集合對象的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明的訪問集合內部的數據。
迭代器使用的意圖是提供一種方法順序訪問一個集合對象中的各個元素,而又不需要暴露該對象的內部細節。現在的電視機,使用[后一個]和[前一個]按鈕切換頻道。當按下[后一個]按鈕時,將切換到下一個預置的頻道。作為電視機的用戶,當我們改變頻道時,我們關心的不是具體的頻道 ,而是節目內容。如果對一個頻道的節目不感興趣,那么可以換下一個頻道,而不需要知道它是具體是第幾頻道,圖1給出了使用頻道迭代器來選臺的對象圖。 圖1使用選頻器做例子的Iterator模式對象圖 迭代器模式在客戶與容器之間加入了迭代器角色。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向 客戶端暴露集合的內部結構。。客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素)都由Iterator來維護,客戶端從不直接和集合類打交道,它總是控制Iterator,向它發送"向前","向后","取當前元素"的命令,就可以間接遍歷整個集合。
為了使客戶程序從與具體迭代器耦合的困境中脫離出來,避免具體迭代器的更換給客戶程序帶來的修改,迭代器模式抽象了具體迭代器,使得客戶程序更具一般性和重用性。
Iterator模式結構圖如圖2所示下:
圖2 Iterator模式結構圖
從結構上可以看出,迭代器模式由以下角色組成:迭代器角色(Iterator),負責定義訪問和遍歷元素的接口;具體迭代器角色(Concrete Iterator),實現迭代器接口,并要記錄遍歷中的當前位置;容器角色(Container),負責提供創建具體迭代器角色的接口;具體容器角色(Concrete Container),實現創建具體迭代器角色的接口,它與該容器的結構相關。
迭代器角色的加入,就可以很好的避免容器內部細節的暴露,而且也使得設計符合“單一職責原則”。具體迭代器角色和具體容器角色是耦合在一起的,即遍歷算法是與容器的內部細節緊密相關的。
3 Java類庫中Iterator模式實現
Java類庫是設計模式的經典應用,在此以Java類庫中的集合框架類(Java Collection Framework)為例來討論Iterator模式的實現。
在JavaCollection Framework的應用中,遍歷的進程是由客戶程序來控制的,這種實現方式被稱為外部迭代器;它比由迭代器自身來控制迭代的內部迭代器更加靈活、強大。
遍歷算法的實現,表面上看應該在迭代器角色中實現。這樣既便于在一個容器上使用不同的遍歷算法,也便于將一種遍歷算法應用于不同的容器。但是這樣就要求容器角色公開自己的私有屬性,從而破壞掉容器的封裝性。所以遍歷算法被放到容器角色里來實現。這樣遍歷算法便和特定的容器捆綁在一起,迭代器角色僅僅存放 [論文網?www.uuubuy.com]一個遍歷的當前位置。這樣做的另一個好處是對同一個容器對象,可以同時進行多個遍歷。因為遍歷狀態是保存在每一個迭代器對象中的。在Java Collection Framework的應用中,提供的具體迭代器角色是定義在容器角色中的內部類,這樣保護了容器的封裝。同時容器也提供了遍歷算法接口,便于擴展各自的迭代器。
下面給出迭代器模式中的四個角色在JDK5.0中的JavaCollection Framework中所對應的代碼片段,以此來分析迭代器模式如何在Java Collection Framework中實現,圖3給出了我們要分析的基本類的類圖:
圖3 Java Collection Framework中一個基本類圖
1)迭代器角色,接口Iterator,定義了遍歷的接口,?
代碼片段1
public interfaceIterator<E> {
boolean hasNext();
E next();
void remove();
}
2)容器角色,接口List。
3)具體容器角色,實現List接口并繼承抽象類AbstractList的ArrayList類。
4)具體迭代器角色,它是以抽象類AbstractList的內部類的形式出來的。抽象類AbstractList是為了將各個具體容器角色的公共部分提取出來而存在的。
代碼片段2所示的方法iterator()是負責創建具體迭代器角色的工廠方法。
代碼片段2:
publicIterator<E> iterator() {
return new Itr();
}
作為內部類的具體迭代器角色,其類圖如圖4所示,具體實現的代碼如代碼段3所示。
圖4 具體迭代器角色類圖
代碼片段3:?
private class Itrimplements Iterator<E> {
intcursor = 0;
intlastRet = -1;
intexpectedModCount = modCount;
publicboolean hasNext() {
return cursor != size();
}
publicE next() {
checkForComodification();
try {
E next = get(cursor)
; lastRet = cursor++; return next; } catch(IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } publicvoid remove() { if (lastRet == -1) throw new IllegalStat eException();
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor) cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
finalvoid checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
迭代器模式的使用如下面的代碼段4所示,客戶程序要先得到具體容器角色,然后再通過具體容器角色得到具體迭代器角色。這樣便可以使用具體迭代器角色來遍歷容器。
代碼片段4
List<E> [論文網?www.uuubuy.com]?list=new ArrayList <E>();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();//do some businesss logic?
}
4 總結
迭代器模式在應用中使用非常廣泛,它通過抽象出一個負責遍歷行為的迭代器類,來達到既不暴露集合的內部結構,又可讓外部代碼透明的訪問集合內部數據的目標。
在實現自己的迭代器時,要操作的容器必須有相應的接口支持,通過在容器內增加相應的內部迭代器類來實現對具體容器的遍歷,并且還要有創建具體迭代器角色的工廠方法。當然,不同結構的容器角色,其遍歷的含義和實現也有較大差別,特別是當容器中存在復合對象或數據結構復雜時,如何進行深層遍歷以及遍歷的安全性都是值得關注的問題。
[參 考文 獻]
[1](美)GoF。設計模式--可復用的面向對象軟件的基礎,機械工業出版社,2005.?
[2]深入淺出Java設計模式, http://www.cn-java.com.
[3].NET設計模式, http://www.cnblogs.com.
[4]龔波。java設計模式,人民郵電出版社,2007.
[5]饒一梅,王治寶,王秀峰。軟件設計模式及其在Java類庫中的典型實現。[J]計算機工程與應用,2002/4,P48—50.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的设计模式——Iterator模式实现研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是存款好还是买理财好?存款和理财的区别
- 下一篇: asp.net ajax控件工具集 Au