Java描述设计模式(13):迭代器模式
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、迭代器模式
1、基礎(chǔ)概念
迭代器模式又叫游標(biāo)模式,是對(duì)象的行為模式。迭代器模式可以順序地訪問一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。
2、模式圖解
3、核心角色
- Iterator:迭代器角色
此抽象角色定義出遍歷元素所需的接口。
- ConcreteIterator:具體迭代器角色
此角色實(shí)現(xiàn)了Iterator接口,并保持迭代過程中的游標(biāo)位置。
- Aggregate:聚集角色
此抽象角色給出創(chuàng)建迭代器(Iterator)對(duì)象的接口。
- ConcreteAggregate:具體聚集角色
聚合持有對(duì)象集合,提供返回迭代器的方法,可以正確遍歷該集合。
- Client:客戶端角色
持有對(duì)聚集及其迭代器對(duì)象的引用,調(diào)用迭代器對(duì)象的迭代接口。
4、源碼案例
public class C02_Iterator {public static void main(String[] args) {Object[] objArray = {"one","two","three","four","five"};Aggregate aggregate = new ConcreteAggregate(objArray);Iterator iterator = aggregate.createIterator();while (!iterator.isEnd()){System.out.println(iterator.currentItem());iterator.next();}} } interface Iterator {void first();void next();boolean isEnd();Object currentItem(); } class ConcreteIterator implements Iterator{//持有被迭代的聚合對(duì)象private ConcreteAggregate agg;//記錄當(dāng)前迭代索引位置private int index = 0;//設(shè)置當(dāng)前聚集對(duì)象的大小private int size = 0;public ConcreteIterator (ConcreteAggregate agg){this.agg = agg;this.size = agg.getSize();index = 0;}@Overridepublic void first() {index = 0;}@Overridepublic void next() {if (index<size){index++;}}@Overridepublic boolean isEnd() {return (index>=size);}@Overridepublic Object currentItem() {return agg.getElement(index);} } abstract class Aggregate {// 創(chuàng)建相應(yīng)迭代器對(duì)象的接口public abstract Iterator createIterator(); } class ConcreteAggregate extends Aggregate{private Object[] objArray = null;public ConcreteAggregate (Object[] objArray){this.objArray = objArray;}@Overridepublic Iterator createIterator() {return new ConcreteIterator(this);}public Object getElement (int index){if (index<objArray.length){return objArray[index];} else {return null;}}public int getSize (){return objArray.length;} }二、JDK集合應(yīng)用
1、簡(jiǎn)單案例
public class C02_ArrayList {public static void main(String[] args) {List<String> stringList = new ArrayList<>() ;stringList.add("One") ;stringList.add("Two") ;stringList.add("Three") ;java.util.Iterator<String> itr = stringList.iterator() ;while (itr.hasNext()){System.out.println(itr.next());}} }2、Iterator源碼
規(guī)定了集合迭代的一些方法。
public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());} }3、ArrayList源碼
- 實(shí)現(xiàn)聚合接口List
- 內(nèi)部迭代器接口實(shí)現(xiàn)
- 返回迭代器
三、迭代器總結(jié)
1、適用場(chǎng)景
迭代器模式是與集合綁定,只要使用集合,就需要同時(shí)這個(gè)集合的迭代器,以此遍歷集合中的數(shù)據(jù),java中的容器對(duì)象Collection,List、Set、Map都有自己的迭代器。容器對(duì)象在編程語言中十分核心,所以在實(shí)現(xiàn)容器的時(shí)候基本都有匹配的迭代器,可以滿足開發(fā)的需要,所以迭代器的自定義實(shí)踐場(chǎng)景比較少。
2、優(yōu)點(diǎn)總結(jié)
簡(jiǎn)化集合遍歷方式,每一個(gè)聚集對(duì)象都可以有一個(gè)或多個(gè)迭代器對(duì)象,每一個(gè)迭代器的迭代狀態(tài)可以是彼此獨(dú)立的。遍歷算法被封裝在迭代器角色里面,因此迭代的算法可以獨(dú)立于聚集角色變化。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結(jié)
以上是生活随笔為你收集整理的Java描述设计模式(13):迭代器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux权限详解
- 下一篇: Java进阶 | Proxy动态代理机制