迭代器设计模式示例
本文是我們名為“ Java設(shè)計模式 ”的學(xué)院課程的一部分。
 在本課程中,您將深入研究大量的設(shè)計模式,并了解如何在Java中實現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應(yīng)用模式中的每一個。 在這里查看 ! 
目錄
1.簡介 2.什么是迭代器設(shè)計模式 3.實施迭代器設(shè)計模式 4.內(nèi)部和外部迭代器1.簡介
聚合對象(例如列表)應(yīng)該為您提供一種在不暴露其內(nèi)部結(jié)構(gòu)的情況下訪問其元素的方法。 此外,您可能想以不同的方式遍歷列表,具體取決于要完成的工作。 但是,即使您可以預(yù)料到需要的遍歷,您也可能不想用用于不同遍歷的操作來充實List接口。 您可能還需要在同一列表上進行多個遍歷。
通過Iterator模式,您可以完成所有這些操作。 此模式的主要思想是將訪問和遍歷的責(zé)任從列表對象中移出,并將其放入迭代器對象中。 Iterator類定義用于訪問列表元素的接口。 迭代器對象負責(zé)跟蹤當(dāng)前元素; 也就是說,它知道已經(jīng)遍歷了哪些元素。
2.什么是迭代器設(shè)計模式
迭代器設(shè)計模式的目的是提供一種在不暴露其基礎(chǔ)表示的情況下順序訪問聚合對象的元素的方法。
迭代器模式允許客戶端對象以順序的方式訪問容器的內(nèi)容,而無需任何有關(guān)其內(nèi)容的內(nèi)部表示的知識。 上面使用的術(shù)語“容器”可以簡單地定義為數(shù)據(jù)或?qū)ο蟮募稀?容器內(nèi)的對象又可以是集合,使其成為集合的集合。
迭代器模式使客戶端對象可以遍歷對象(或容器)的此集合,而無需容器透露內(nèi)部如何存儲數(shù)據(jù)。 為此,Iterator模式建議應(yīng)將Container對象設(shè)計為以Iterator對象的形式提供公共接口,以供不同的客戶端對象訪問其內(nèi)容。 Iterator對象包含公共方法,以允許客戶端對象在容器內(nèi)的對象列表中導(dǎo)航。
圖1-類圖
迭代器
- 定義用于訪問和遍歷元素的接口。
ConcreteIterator
- 實現(xiàn)Iterator接口。
- 跟蹤聚合中的當(dāng)前位置。
骨料
- 定義用于創(chuàng)建Iterator對象的接口。
混凝土骨料
- 實現(xiàn)Iterator創(chuàng)建接口以返回適當(dāng)?shù)腃oncreteIterator的實例。
3.實施迭代器設(shè)計模式
讓我們使用Shape類實現(xiàn)Iterator Design Pattern。 我們將使用迭代器存儲和迭代Shape對象。
package com.javacodegeeks.patterns.iteratorpattern;public class Shape {private int id;private String name;public Shape(int id, String name){this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString(){return "ID: "+id+" Shape: "+name;}}簡單的Shape類具有一個id和name作為其屬性。
package com.javacodegeeks.patterns.iteratorpattern;public class ShapeStorage {private Shape []shapes = new Shape[5];private int index;public void addShape(String name){int i = index++;shapes[i] = new Shape(i,name);}public Shape[] getShapes(){return shapes;} }上面的類用于存儲Shape對象。 該類包含一個Shape類型的數(shù)組,為簡單起見,我們已將該數(shù)組初始化為最多5個addShape方法用于向該數(shù)組添加Shape對象,并將索引加1。 getShapes方法返回Shape類型的數(shù)組。
package com.javacodegeeks.patterns.iteratorpattern;import java.util.Iterator;public class ShapeIterator implements Iterator<Shape>{private Shape [] shapes;int pos;public ShapeIterator(Shape []shapes){this.shapes = shapes;}@Overridepublic boolean hasNext() {if(pos >= shapes.length || shapes[pos] == null)return false;return true;}@Overridepublic Shape next() {return shapes[pos++];}@Overridepublic void remove() {if(pos <=0 )throw new IllegalStateException("Illegal position");if(shapes[pos-1] !=null){for (int i= pos-1; i<(shapes.length-1);i++){shapes[i] = shapes[i+1];}shapes[shapes.length-1] = null;}} }上面的類是Shape類的Iterator 。 這個類實現(xiàn)了Iterator接口和定義的所有方法Iterator接口。
如果還有一個項目, hasNext方法將返回一個boolean 。 next方法從集合中返回下一個項目,而remove方法從集合中刪除當(dāng)前項目。
package com.javacodegeeks.patterns.iteratorpattern;public class TestIteratorPattern {public static void main(String[] args) {ShapeStorage storage = new ShapeStorage();storage.addShape("Polygon");storage.addShape("Hexagon");storage.addShape("Circle");storage.addShape("Rectangle");storage.addShape("Square");ShapeIterator iterator = new ShapeIterator(storage.getShapes());while(iterator.hasNext()){System.out.println(iterator.next());}System.out.println("Apply removing while iterating...");iterator = new ShapeIterator(storage.getShapes());while(iterator.hasNext()){System.out.println(iterator.next());iterator.remove();}}}上面的代碼將導(dǎo)致以下輸出:
ID: 0 Shape: Polygon ID: 1 Shape: Hexagon ID: 2 Shape: Circle ID: 3 Shape: Rectangle ID: 4 Shape: Square Apply removing while iterating... ID: 0 Shape: Polygon ID: 2 Shape: Circle ID: 4 Shape: Square在上面的類中,我們創(chuàng)建了一個ShapeStorage對象并將Shape對象存儲在其中。 接下來,我們創(chuàng)建一個ShapeIterator對象,并ShapeIterator分配形狀。 我們重復(fù)了兩次,首先不調(diào)用remove方法,然后再使用remove方法。
輸出顯示了remove方法的影響。 第一次迭代時,迭代器將打印所有形狀,但是當(dāng)調(diào)用remove方法時,它將首先打印當(dāng)前形狀并移至下一個形狀。 然后,我們對其調(diào)用了remove方法,該方法刪除當(dāng)前形狀,然后迭代器指向下一個可用的形狀對象。
因此,“在迭代時應(yīng)用刪除...”之后的輸出僅顯示0、2和4個形狀對象。
4.內(nèi)部和外部迭代器
迭代器可以設(shè)計為內(nèi)部迭代器或外部迭代器。
4.1內(nèi)部迭代器
- 集合本身提供允許客戶端訪問集合中不同對象的方法。 例如, java.util.ResultSet類包含數(shù)據(jù),還提供諸如next的方法來瀏覽項目列表。
- 任何給定時間集合上只能有一個迭代器。
- 集合必須維護或保存迭代狀態(tài)。
4.2外部迭代器
- 迭代功能與集合分離,并保留在另一個稱為迭代器的對象內(nèi)。 通常,集合本身會根據(jù)客戶端的輸入向客戶端返回適當(dāng)?shù)牡鲗ο蟆?例如, java.util.Vector類的迭代器以Enumeration類型的單獨對象的形式定義。 響應(yīng)elements()方法調(diào)用,此對象返回到客戶端對象。
- 在任何給定時間,給定集合上可以有多個迭代器。
- 存儲迭代狀態(tài)所涉及的開銷與集合無關(guān)。 它位于獨占的Iterator對象中。
5.何時使用迭代器設(shè)計模式
使用迭代器模式:
- 在不暴露其內(nèi)部表示的情況下訪問聚合對象的內(nèi)容。
- 支持聚合對象的多次遍歷。
- 為遍歷不同的聚合結(jié)構(gòu)提供統(tǒng)一的接口(即,支持多態(tài)迭代)。
6. JDK中的迭代器模式
- java.util.Iterator
- java.util.Enumeration
7.下載源代碼
這是關(guān)于迭代器設(shè)計模式的課程。 您可以在此處下載源代碼: IteratorPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/iterator-design-pattern.html
總結(jié)
 
                            
                        - 上一篇: jsf集成spring_Spring和J
- 下一篇: 传奇永恒铭文位2怎么开(传奇永恒铭文节点
