博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 之 迭代器模式
阅读量:6533 次
发布时间:2019-06-24

本文共 2955 字,大约阅读时间需要 9 分钟。

hot3.png

设计模式 之 迭代器模式

行为型模式

目的

遍历聚合对象(集合或数组)的元素

迭代器核心代码

  • 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。

码云

博客

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2933828

你可能感兴趣的文章
hadoop无法启动DataNode问题
查看>>
java泛型中<?>和<T>区别
查看>>
这里是指推送通知跟NSNotification有区别:
查看>>
Linux中断(interrupt)子系统之一:中断系统基本原理【转】
查看>>
用户ID的代码生成
查看>>
win7经常出现“关闭xxxx前您必须关闭所有会话框”
查看>>
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>
react-native 常见操作 及 git 补充
查看>>
MongoDB 自己定义函数
查看>>
Summary Day30
查看>>
逆向输出回环数组
查看>>
自己动手,实现“你的名字”滤镜
查看>>
想要快速搭建开发测试环境?这么做就可以!
查看>>
需求引导设计 切莫教条主义
查看>>
EF架构~mysql数据库无法创建数据模型
查看>>
PyCharm常用设置
查看>>
dma子系统 dmac
查看>>
php的内核组成模块和运行原理
查看>>
Statement和PreparedStatement深入学习总结
查看>>
高清摄像头MIPI CSI2接口浅解【转】
查看>>