设计模式 之 迭代器模式
行为型模式
目的
遍历聚合对象(集合或数组)的元素
迭代器核心代码
- boolean hasNext()
- Object next()
介绍
迭代器模式下的角色主要分为:迭代器 和 聚合对象。
思路:
我们先创建 迭代器接口(Iterator) 与 聚合对象接口(List) 其中 聚合对象中有直接获取迭代器的方法。
这样我们可以自定义 迭代器实现(MyIterator) 与 聚合对象实现(MyList) ,并支持迭代器与聚合对象的扩展。(优点)
代码
- Iterator - 迭代器接口
- List - 聚合对象接口
- MyIterator - 迭代器具体类 -> 类似 ArrayList 中的 Itr
- MyList - 聚合对象具体类 -> 类似 ArrayList
Iterator
/** * 迭代器接口 ,类似于Iterator * @author GaoYuan * @date 2018/11/11 下午3:32 */public interface Iterator { /** * 是否有下一个对象 */ boolean hasNext(); /** * 返回下一个对象 */ Object next();}
List
/** * 聚合对象的接口 * @author GaoYuan * @date 2018/11/11 上午10:28 */public interface List { /** 添加 */ void add(Object o); /** 获取指定位置的元素 */ Object get(int index); /** 获取迭代器 */ Iterator iterator(); /** 获取聚合对象的大小=元素数量 */ int getSize();}
MyIterator
/** * 具体迭代器 - 就像ArrayList中的Itr * * 核心方法 * @see MyIterator#hasNext() * @see MyIterator#next() * * @author GaoYuan * @date 2018/11/11 下午3:36 */public class MyIterator implements Iterator { /** 聚合对象 */ private List list; /** 遍历的下标索引 */ private int index; public MyIterator(List list) { this.list = list; } /** * 是否有下个元素 * @author GaoYuan * @date 2018/11/11 上午8:45 */ @Override public boolean hasNext() { if(index < list.getSize()){ return true; } return false; } /** * 直接返回下个元素 * @author GaoYuan * @date 2018/11/11 上午8:46 */ @Override public Object next() { if(hasNext()){ // 记得 ++ return list.get(index++); } return null; }}
MyList
/** * 具体的聚合对象 - 模拟ArrayList部分内容 * @author GaoYuan * @date 2018/11/11 上午10:28 */public class MyList implements List{ /** 当前数据数组 - 初始为空 */ private Object[] list = {}; /** 遍历的下标索引 - 初始为0 */ private int index = 0; /** 当前元素的个数 */ private int size = 0; /** 容量 */ private int capacity = 16; public MyList() { list = new Object[capacity]; index = 0; size = 0; } @Override public void add(Object o) { if(size >= capacity){ // 需要扩容,扩容两倍 capacity = capacity * 2; list = Arrays.copyOf(list, capacity); } list[index++] = o; size ++; } @Override public Object get(int index) { return list[index]; } @Override public Iterator iterator() { // 将当前聚合对象传递至迭代器 - 这里可以选择不同的具体迭代器 return new MyIterator(this); } @Override public int getSize() { return size; }}
测试类
public static void main(String[] args){ List list = new MyList(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); // 获取迭代类 Iterator iterator = list.iterator(); // 判断是否有下个元素 while (iterator.hasNext()){ // 打印下个元素对象 System.out.println(iterator.next()); }}
输出
ABCD
综上,遍历成功。有兴趣的可以看看JDK中的 ArrayList。
码云
博客
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)