迭代器模式
迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環境中非常常用的設計模式。這種模式用于順序訪問集合對象的元素,不需要知道集合對象的底層表示。
迭代器模式屬于行為型模式。
介紹
意圖: 提供一種方法順序訪問一個聚合對象中各個元素, 而又無須暴露該對象的內部表示。
主要解決: 不同的方式來遍歷整個整合對象。
何時使用: 遍歷一個聚合對象。
如何解決: 把在元素之間游走的責任交給迭代器,而不是聚合對象。
關鍵代碼: 定義接口:hasNext, next。
** 應用實例:** JDK中Collectoin的 iterator。
優點:
- 它支持以不同的方式遍歷一個聚合對象。
- 迭代器簡化了聚合類。
- 在同一個聚合上可以有多個遍歷。
- 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。
缺點:
由于迭代器模式將存儲數據和遍歷數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性。
使用場景:
- 訪問一個聚合對象的內容而無須暴露它的內部表示。
- 需要為聚合對象提供多種遍歷方式。
- 為遍歷不同的聚合結構提供一個統一的接口。
注意事項:
迭代器模式就是分離了集合對象的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的數據。
代碼實現
迭代器接口
public interface MyIterator<E> {boolean hasNext();E next();
}
迭代器生成接口
public interface IteratorBuilder<E> {MyIterator<E> iterator();}
動漫類
public class Animation implements IteratorBuilder<String>{private final String[] videos;private int position;public Animation(int maxSize){videos = new String[maxSize];}public String get(int index){return videos[index];}public void add(String video){videos[position++] = video;}public void addAll(String[] videoArr){for (String s : videoArr) {add(s);}}public MyIterator<String> iterator(){return new AnimationIterator();}private class AnimationIterator implements MyIterator<String> {private int index;public AnimationIterator(){this.index = 0;}public boolean hasNext(){return index < videos.length;}public String next(){return videos[index++];}}
}
客戶端
public class Client {public static void main(String[] args) {String[] videos = {"斗羅大陸", "練氣十萬年", "斗破蒼穹", "仙逆", "火影"};Animation animation = new Animation(videos.length);animation.addAll(videos);MyIterator<String> iterator = animation.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}