#
迭代器模式(Iterator Pattern)是一种非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部结构。
解决: 不同的方式来遍历整个整合对象。
设计思想: 把在元素之间游走的责任交给迭代器,而不是聚合对象。
接口包含 :hasNext, next。
优点: 1、支持不同的方式来遍历对象。 2、简化了java内部结构。 3、在一个类中可以有多个迭代器。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、不暴露类中的底层机构。 2、需要为类提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
思想: 迭代器模式分离了集合对象的遍历行为和数据存储行为,将两个行为分开,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
JDK中典型使用了迭代器设计模式的是集合类(List,set),下面对ArrayList进行分析,实现步骤:
1. 定义一个迭代器接口,里面包含迭代器最基本的方法。
2. 在集合的实现类(ArrayList)中,定义一个内部类实现迭代器接口,并用private作用类的修饰符(保证此类对外不可见)。
3. 对外提供迭代器接口的引用。
// 迭代器对外访问实现 public java.util.Iterator<E> iterator() { return new ArrayList.Itr(); } /** * 遍历行为,private修饰符,对外不可见。 实现了迭代器接口 */ private class Itr implements java.util.Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; // 判断是否存在下个元素 public boolean hasNext() { return cursor != size; } // 获取下一个元素 public E next() { //... return (E) elementData[lastRet = i]; } // 移除迭代器中的元素 public void remove() { //... } }
1. 创建接口:
package itereatorTest; public interface Container { Iterator getIterator(); } package itereatorTest; public interface Iterator { boolean hasNext(); Object next(); }
2. 创建container接口的实现类,实现类内部类IteratorImpl现实现了迭代器Iterator
package itereatorTest; public class ContainerImpl implements Container{ String [] names = {"zhangsan","lisi","wanger","zhaowu"}; @Override public Iterator getIterator() { return new IteratorImpl(); } // 内部类,实现了迭代器接口 private class IteratorImpl implements Iterator{ int index; @Override public boolean hasNext() { return index < names.length; } @Override public Object next() { if (this.hasNext()) { return names[index++]; } return null; } } }
3. 测试类
package itereatorTest; // 测试类 public class MainTest { public static void main(String[] args) { Container container = new ContainerImpl(); Iterator iterator = container.getIterator(); while (iterator.hasNext()) { System.out.println("name :" +iterator.next()); } } }
4. 测试结果:
name :zhangsan name :lisi name :wanger name :zhaowu
原文链接:https://blog.csdn.net/q54244125/article/details/81318323