1. 程式人生 > >叠代器模式以及對內部類的運用

叠代器模式以及對內部類的運用

耦合度 bool 通信 同名 基本 函數 想要 array 靜態

一、

上一篇文章寫了static的作用,其中有部分是介紹了內部類和靜態內部類,下面就結合設計模式中的叠代器模式,介紹一下內部類的好處;

1.首先將內部類的作用說一下:

一、內部類可以直接訪問外部類的東西,如果沒有內部類,要實現叠代器模式,有2種方式,第一,在容器類中定義一些方法,那就需要定義一些全局成員變量來記錄光標等等一些數據,導致容器類繁雜,不易擴展。第二,與容器類平級建立一個叠代器類,這就需要類與類之間的通信,提升了容器類與叠代器類之間的耦合度。

  而,內部類,可以直接訪問到容器類的成員變量與成員函數,內部類只需實現自己的方法即可。

  還有一個好處就是借鑒一位網友評論所講的,比如ArrayList的內部類 ArrayIterator被其它類重復使用到的機會很少,這才導致他們將它設計成內部類,如果會被其它類大量重用,設計成內部類就不太好了,即使它有那麽多“優點”。

HashMap的內部類Entry就是典型的出於這個原因設計的,首先是它想要用外部類Entry都不行,已經存在同名的類了,而恰巧HashMap的Entry也基本只有HashMap自己會用,那就正好設計成內部類了。

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; //直接返回外部類對應的數據
        }
    }
}

叠代器模式以及對內部類的運用