【设计模式】行为型-迭代器模式
文章目录前言一、概念二、核心结构三、Java 代码实现简易 ArrayList 迭代器1. 抽象迭代器2. 抽象聚合容器3. 具体容器模拟 ArrayList4. 客户端遍历四、内部类实现迭代器的好处五、Java 内置迭代器实际开发几乎都用这个六、优缺点优点缺点七、应用场景八、迭代器模式 VS 其他模式九、总结前言在开发中我们几乎天天和集合打交道List、Set、Map、数组、树、图……不同集合的存储结构、遍历方式完全不同如果让客户端直接去遍历各种复杂结构代码会严重耦合、难以扩展。迭代器模式就是专门封装集合遍历细节、统一遍历接口的行为型设计模式让我们能用同一套代码遍历任意容器而不用关心底层结构。一、概念迭代器模式Iterator Pattern是一种行为型设计模式核心思想提供一种方法顺序访问一个聚合对象集合/容器中的各个元素而又不暴露该对象的内部表示。简单理解把怎么遍历抽成独立的迭代器类容器只负责存数据迭代器负责遍历数据客户端只用hasNext()、next()就能遍历任何容器。一句话总结统一遍历行为隔离容器结构让遍历与集合解耦。二、核心结构Iterator抽象迭代器定义遍历接口hasNext()、next()等。ConcreteIterator具体迭代器实现迭代逻辑记录当前遍历位置。Aggregate抽象聚合/容器定义创建迭代器的接口。ConcreteAggregate具体聚合/容器实现容器返回对应的迭代器。Client客户端面向迭代器编程统一遍历。三、Java 代码实现简易 ArrayList 迭代器实现一个自定义数组容器 自定义迭代器。1. 抽象迭代器publicinterfaceIteratorT{booleanhasNext();Tnext();}2. 抽象聚合容器publicinterfaceAggregateT{IteratorTcreateIterator();voidadd(Tt);}3. 具体容器模拟 ArrayListpublicclassMyArrayListTimplementsAggregateT{privateObject[]itemsnewObject[10];privateintsize0;Overridepublicvoidadd(Tt){items[size]t;}OverridepublicIteratorTcreateIterator(){returnnewMyArrayListIterator();}// 具体迭代器内部类方便访问容器数据privateclassMyArrayListIteratorimplementsIteratorT{privateintindex0;OverridepublicbooleanhasNext(){returnindexsize;}OverrideSuppressWarnings(unchecked)publicTnext(){return(T)items[index];}}}4. 客户端遍历publicclassClient{publicstaticvoidmain(String[]args){AggregateStringlistnewMyArrayList();list.add(A);list.add(B);list.add(C);// 获取迭代器统一遍历IteratorStringiteratorlist.createIterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}输出A B C四、内部类实现迭代器的好处迭代器需要频繁访问容器内部元素内部类可直接访问私有成员迭代器与容器绑定对外隐藏实现细节一个容器可以提供多个迭代器正序、倒序、随机遍历。五、Java 内置迭代器实际开发几乎都用这个Java 集合框架完全基于迭代器模式实现java.util.Iteratorjava.util.ListIteratorIterable接口Collection继承它日常写法ListStringlistnewArrayList();IteratorStringiteratorlist.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}// 增强for循环底层也是迭代器for(Strings:list){}六、优缺点优点统一遍历接口遍历任意集合代码都一样。隐藏容器内部结构客户端无需关心存储方式。遍历与集合解耦集合变、迭代器变互不影响。一个集合可提供多种遍历方式正序、逆序等。符合单一职责集合存数据迭代器做遍历。缺点每类容器对应一类迭代器类数量增多。遍历过程中修改集合可能引发并发异常fail-fast。对于简单集合略显繁琐。七、应用场景统一遍历不同集合List、Set、Map、树、链表等。不想暴露集合内部结构只提供遍历能力。需要支持多种遍历方式。框架底层集合设计几乎所有语言的集合库都用迭代器。经典应用JavaCollection全部迭代器MyBatis 游标查询CursorSpringResource遍历资源树形结构、图结构的统一遍历八、迭代器模式 VS 其他模式迭代器专注遍历集合元素责任链专注按顺序处理请求组合模式 迭代器天然搭配遍历树形结构非常常用九、总结迭代器模式 统一遍历接口 隔离集合结构核心把遍历逻辑从集合中抽离出来结构Aggregate(容器) Iterator(迭代器)Java 集合框架就是标准迭代器模式教科书日常开发不用自己写直接用 JDK 内置的即可