多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 淺談設計模式:迭代器模式(Iterator Pattern)

淺談設計模式:迭代器模式(Iterator Pattern)

來源:程序員人生   發布時間:2015-04-30 08:22:46 閱讀次數:4090次

酷愛生活、享受文娛、專注技術,歡迎關注QGer,我們1起見證成長!
這里寫圖片描述

甚么是迭代器模式?

官方解釋:to access the elements of an aggregate object sequentially without exposing its underlying implementation.
順序地訪問集合對象的元素并且不暴露它的內部實現

 通俗解釋:假定給定1個集合對象,定義1個與之相干聯的Iterator(迭代器),該迭代器能夠訪問集合對象的內部元素,通過迭代的方法能夠依照順序順次訪問集合對象的每個元素。

為何使用迭代器模式?

  • 它能讓集合內部元素結構對客戶端透明的情況下遍歷該集合。保證了封裝性,透明性。
  • 提供了1個統1的方法去訪問你的數據對象(集合),并且你不需要知道數據對象的類型。
  • 實用性很強,得到了廣泛的利用,并且拓展性很強,容易自己進行拓展。

如何使用迭代器模式?

UML圖以下:
這里寫圖片描述
各個組件解釋:

  • Iterator:抽象迭代器,定義了迭代器最基本的接口。如:hasNext()表示是不是該迭代是不是還有下1個元素,next則是返回迭代的下1個元素。

  • Aggregate:抽象集合,定義了集合的基本操作接口。如:add()向該集合增加1個原色,remove()則表示刪除某個元素。

  • ComcreteAggregate:具體數據集合類,定義了集合元素的結構,操作細節。同時在類內部定義了1個具體迭代器并提供1個能夠返回迭代器對象的方法。

  • ConcreteIterator:具體迭代器,通常定義在聚合類的內部,以此來到達訪問聚合類內部數據結構的目的,同時實現了迭代訪問聚合類元素的方法。

使用范圍:

  • 當你想要在不暴露其內部表示的情況下訪問1個對象集合

  • 當你想要有多種遍歷方式來遍歷1個對象集合,如正序、倒序、跳表訪問

利用舉例:
假定現在有1個學生對象集合類,客戶端其實不想關心其內部細節,只需要能遍歷學生對象(或學生對象的某些屬性)便可。使用迭代器模式來實現這個需求。
1、定義迭代器和集合的抽象接口。

interface Iterator<T> { T next(); boolean hasNext(); } interface Collection<T> { boolean add(T element); boolean remove(T element); }

2、定義學生對象類,簡明起見,不定義太多復雜屬性

public class Student { private String id; private String name; public Student(String id, String name) { this.id = id; this.name = name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } }

3、實現具體學生對象聚合類,并在內部依賴定義具體迭代器。

public class StudentList implements Collection<Student> { List<Student> elementList = new ArrayList<>(); @Override public void add(Student element) { elementList.add(element); } @Override public boolean remove(Student element) { return elementList.remove(element); } public Iterator<Student> createIterator(){ return new StudentIterator(elementList); } //具體迭代器類 private class StudentIterator implements Iterator<Student> { private List<Student> students; private int position; public StudentIterator(List<Student> students) { this.students = students; this.position = 0; } @Override public Student next() { if(hasNext()) { return students.get(position++); } return null; } @Override public boolean hasNext() { return position < students.size(); } } }

4、使用客戶端調用,此處mock1個測試數據,方便調用。

public class Client { public static void main(String[] args) { StudentList studentList = new StudentList(); studentList.add(new Student("001", "張3")); studentList.add(new Student("002", "李4")); studentList.add(new Student("004", "趙5")); studentList.add(new Student("004", "錢6")); Iterator<Student> iterator = studentList.createIterator(); while(iterator.hasNext()){ Student student = iterator.next(); System.out.println(student.getId() + student.getName()); } } }

注:此處的抽象迭代器、抽象集合接口,均只聲明了最簡單經常使用的方法,之際開發中可以根據需求增加各種各樣的方法,如Java.Util里面的Iterator定義接口以下:
這里寫圖片描述
迭代器則可以根據具體的聚合,選擇不同的遍歷方式:正序、倒序、跳表等。而遍歷的可以不是全部對象,也許你指向遍歷對象的某個屬性呢,如上例你指向要遍歷學生的學號,或說學號用得最勤勞,那末你另外定義1個迭代方法nextId來遍歷學生的學號呀。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美视频在线观看爱爱 | 中文字幕无线码中文字幕免费 | 午夜国产精品不卡在线观看 | 欧美成视频人免费淫片 | 亚洲精品福利 | 亚洲天堂视频在线 | 91色视频网站| 在线免费观看一级毛片 | 欧美一区二区精品系列在线观看 | 亚洲 欧美 自拍 另类 欧美 | 欧美日韩xxx | 日本大片免费播放网站 | h免费视频| 一级特黄特黄毛片欧美的 | freexxxx性特大另类ww | 伊人情人综合 | 黄色欧美一级片 | 精品久久久久久国产免费了 | 久久亚洲精品永久网站 | 欧美日韩一区二区亚洲 | 久久亚洲精选 | 欧美亚洲777 | 国产毛片毛片精品天天看 | 一级毛片一级毛片一级级毛片 | 精品国产精品 | www.伊人.com| 波多野结衣国产一区 | 美国一级毛片片aa免 | 波多野结衣一区二区三区在线观看 | 性感美女视频免费网站午夜 | 中文乱码精品一区二区三区 | 欧美xxxx性| 国内精品视频成人一区二区 | 亚洲精品一区二区三区在线播放 | 波多野结衣资源在线 | 国产成人精品曰本亚洲78 | 91一区二区在线观看精品 | 欧美黑粗特黄午夜大片 | free性欧美18一19hd| 夜趣第一宅男福社区国产 | 91福利国产在线观一区二区 |