Java無疑是最成功的項目之一了,而在其中學習設計模式和架構設計,無疑是最好不過了。 概念: 提供一種方法訪問容器中的各個元素,而又不暴露該對象的內部細節。 使用場景: 和容器經常在一起,我們定義了一個容器,還要提供外部訪問的方法,迭代器模式無疑是最好不過了。 迭代器模式的UML類圖: 下麵的代碼是 ...
Java無疑是最成功的項目之一了,而在其中學習設計模式和架構設計,無疑是最好不過了。
概念:
提供一種方法訪問容器中的各個元素,而又不暴露該對象的內部細節。
使用場景:
和容器經常在一起,我們定義了一個容器,還要提供外部訪問的方法,迭代器模式無疑是最好不過了。
迭代器模式的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>{ private int cursor=0; public boolean hasNext() { if(cursor<array.length){ return true; } return false; } @SuppressWarnings("unchecked") public E next() { E e=(E) array[cursor++]; return e; } } }
內部類的好處:
如果沒有內部類,要實現迭代器模式,有2種方式,第一,在容器類中定義一些方法,那就需要定義一些全局成員變數來記錄游標等等一些數據,導致容器類繁雜,不易擴展。第二,與容器類平級建立一個迭代器類,這就需要類與類之間的通信,提升了容器類與迭代器類之間的耦合度。
而,內部類,可以直接訪問到容器類的成員變數與成員函數,內部類只需實現自己的方法即可。
我認為,在一個類中,單純的成員變數與成員函數滿足不了日益複雜的需求,有時候,類內部中的概念也需要變數與函數,相信這就是內部類的意義所在。