1. 程式人生 > >設計模式之叠代器模式解析學習源碼(十八)

設計模式之叠代器模式解析學習源碼(十八)

定義 cas blank 變量 學習 叠代器模式 array 叠代器 壓入

原文獻上, 點擊滴滴滴


叠代器模式(Iterator)定義: 提供一種方法順序訪問聚合對象的各個元素嗎而又不暴露該對象的內部展示

不用Iterator的壞處

  • 原文中編寫了三個簡單的集合 ArraryList HashSet LinkedList 原先是沒有實現Iterable 內部沒有具體實現iterator
  • 問題1: 遍歷的時候遍歷了幾次
    • 使用數組遍歷的時候實際是遍歷了兩次, 由於System.arrayCopy 和 set的 toArray 看不到源碼, 但是LinkedList 可以看到鏈表遍歷了一次, 然後我們再遍歷這個數組, 打印
  • 問題2: 如何解決這個問題
    • 可以給 LinkedList ArrayList 加get(index)的方法遍歷, 但是
      HashSet就沒法了, 實際上是Map的key集合, 無序的, 實際上這裏面linkedList的get 比較麻煩了, 所以有查詢的性能的問題
  • 總結: 牛人左哥: "那就用叠代器模式吧"

看叠代器模式與非叠代的UML區別

技術分享

技術分享

  • 很相似, 但叠代器模式有個接口這個概念
  • 遍歷對象的區間

叠代器模式有哪些說不上的缺點

  • 具體的集合類與具體的叠代器是綁定的關系, 這種實現方式幾乎沒有復用的可能, 可以看著是特事特辦, 算是把雙刃劍, 權衡自己把握

class文件的描述

  • 以前重來都沒有去嘗試解析
  • 現在先記下
    • invoke 調用 virtual(實現類)方法 interface(接口)方法
    • astore 賦值棧 _33+1個引用變量
    • aload 壓入值棧 _33+1個引用變量
    • checkcast 檢測類型轉換
    • getStatic 獲取靜態屬性
    • ifne 如果返回true就 執行

設計模式之叠代器模式解析學習源碼(十八)