叠代器模式以及對內部類的運用
阿新 • • 發佈:2018-08-16
耦合度 bool 通信 同名 基本 函數 想要 array 靜態 HashMap的內部類Entry就是典型的出於這個原因設計的,首先是它想要用外部類Entry都不行,已經存在同名的類了,而恰巧HashMap的Entry也基本只有HashMap自己會用,那就正好設計成內部類了。
一、
上一篇文章寫了static的作用,其中有部分是介紹了內部類和靜態內部類,下面就結合設計模式中的叠代器模式,介紹一下內部類的好處;
1.首先將內部類的作用說一下:
一、內部類可以直接訪問外部類的東西,如果沒有內部類,要實現叠代器模式,有2種方式,第一,在容器類中定義一些方法,那就需要定義一些全局成員變量來記錄光標等等一些數據,導致容器類繁雜,不易擴展。第二,與容器類平級建立一個叠代器類,這就需要類與類之間的通信,提升了容器類與叠代器類之間的耦合度。
而,內部類,可以直接訪問到容器類的成員變量與成員函數,內部類只需實現自己的方法即可。
還有一個好處就是借鑒一位網友評論所講的,比如ArrayList的內部類 ArrayIterator被其它類重復使用到的機會很少,這才導致他們將它設計成內部類,如果會被其它類大量重用,設計成內部類就不太好了,即使它有那麽多“優點”。
2.叠代器模式的好處:
- 簡化了遍歷方式,對於對象集合的遍歷,還是比較麻煩的,對於數組或者有序列表,我們尚可以通過遊標來取得,但用戶需要在對集合了解很清楚的前提下,自行遍歷對象,但是對於hash表來說,用戶遍歷起來就比較麻煩了。而引入了叠代器方法後,用戶用起來就簡單的多了。
- 可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種叠代器,用戶用起來只需要得到我們實現好的叠代器,就可以方便的對集合進行遍歷了。
- 封裝性良好,用戶只需要得到叠代器就可以遍歷,而對於遍歷算法則不用去關心。
- 當增加其他的集合類型時候,直接實現對應接口,內部類直接實現Iterator接口,實現其所有相關方法,完全符合開閉原則(本人自己想的);
二、UML圖
下面的代碼是Java集合框架內部實現叠代器模式的精簡版:
public interface Iterator<E> {//叠代器接口精簡版 boolean hasNext(); E next(); }
public interface List<E> {//容器接口精簡版 Iterator<E> iterator(); }
public class ArrayList<E> implements List<E> { private Object[] array; public ArrayList(){ this.array=new Object[5]; this.array[0]="a"; this.array[1]="b"; this.array[2]="c"; this.array[3]="d"; this.array[4]="e"; } public Iterator<E> iterator() { return new ArrayIterator(); } public class ArrayIterator implements Iterator<E>{ //內部類中實現了其他類接口,減少了耦合性 必須要實現Iterator要具備的方法 private int cursor=0; public boolean hasNext() { if(cursor<array.length){ //可以直接訪問外部類的Object數組 return true; } return false; } @SuppressWarnings("unchecked") public E next() { E e=(E) array[cursor++]; return e; //直接返回外部類對應的數據 } } }
叠代器模式以及對內部類的運用