设计模式:迭代器模式

这篇具有很好参考价值的文章主要介绍了设计模式:迭代器模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

迭代器模式的示例可以涵盖各种数据结构的遍历,包括数组、列表、树、图等。下面是一些不同场景下迭代器模式的示例及其代码实现。

示例 1: 数组遍历

使用迭代器模式遍历数组。

// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 数组迭代器
class ArrayIterator<T> implements Iterator<T> {
    private T[] array;
    private int currentIndex = 0;

    public ArrayIterator(T[] array) {
        this.array = array;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < array.length;
    }

    @Override
    public T next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return array[currentIndex++];
    }
}

// 客户端代码
public class ArrayIteratorExample {
    public static void main(String[] args) {
        Integer[] numbers = {1, 2, 3, 4, 5};
        Iterator<Integer> iterator = new ArrayIterator<>(numbers);

        while (iterator.hasNext()) {
            Integer number = iterator.next();
            System.out.println(number);
        }
    }
}

示例 2: 二叉树的深度优先遍历

二叉树的深度优先遍历(使用栈实现)。

// 树节点
class TreeNode<T> {
    T value;
    TreeNode<T> left;
    TreeNode<T> right;

    TreeNode(T value) {
        this.value = value;
    }
}

// 树的迭代器
class BinaryTreeIterator<T> implements Iterator<T> {
    private Stack<TreeNode<T>> stack = new Stack<>();

    public BinaryTreeIterator(TreeNode<T> root) {
        pushLeft(root);
    }

    private void pushLeft(TreeNode<T> node) {
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
    }

    @Override
    public boolean hasNext() {
        return !stack.isEmpty();
    }

    @Override
    public T next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        TreeNode<T> node = stack.pop();
        pushLeft(node.right);
        return node.value;
    }
}

// 客户端代码
public class BinaryTreeIteratorExample {
    public static void main(String[] args) {
        TreeNode<Integer> root = new TreeNode<>(1);
        root.left = new TreeNode<>(2);
        root.right = new TreeNode<>(3);
        root.left.left = new TreeNode<>(4);
        root.left.right = new TreeNode<>(5);

        Iterator<Integer> iterator = new BinaryTreeIterator<>(root);

        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println(value);
        }
    }
}

示例 3: 分页遍历

在分页查询场景中使用迭代器模式。

// 分页迭代器
class PagingIterator<T> implements Iterator<T> {
    private Iterator<T> currentIterator;
    private int pageSize;
    private int currentPage = 0;
    private Supplier<List<T>> pageSupplier;

    public PagingIterator(int pageSize, Supplier<List<T>> pageSupplier) {
        this.pageSize = pageSize;
        this.pageSupplier = pageSupplier;
        fetchNextPage();
    }

    private void fetchNextPage() {
        List<T> page = pageSupplier.get();
        currentIterator = page.iterator();
        currentPage++;
    }

    @Override
    public boolean hasNext() {
        if (currentIterator.hasNext()) {
            return true;
        }
        fetchNextPage(); // 尝试获取下一页
        return currentIterator.hasNext();
    }

    @Override
    public T next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return currentIterator.next();
    }
}

// 模拟分页数据提供函数
Supplier<List<Integer>> pageSupplier = new Supplier<List<Integer>>() {
    private int totalPages = 5;
    private int currentPage = 0;

    @Override
    public List<Integer> get() {
        if (currentPage < totalPages) {
            currentPage++;
            return Arrays.asList(1, 2, 3); // 模拟每页的数据
        }
        return Collections.emptyList();
    }
};

// 客户端代码
public class PagingIteratorExample {
    public static void main(String[] args) {
        Iterator<Integer> iterator = new PagingIterator<>(3, pageSupplier);

        while (iterator.hasNext()) {
            Integer number = iterator.next();
            System.out.println(number);
        }
    }
}

总结与建议

以上示例展示了迭代器模式在不同数据结构遍历上的应用。迭代器模式的关键优势是它提供了一种统一的接口来遍历各种类型的数据结构,同时对客户端隐藏了数据结构的实现细节。

在实现迭代器模式时,建议:

  • 保持迭代器接口简单,通常包含 hasNext()next() 方法即可。
  • 确保迭代器正确处理底层数据结构的变更。
  • 考虑迭代器的线程安全性,特别是在多线程环境中使用共享数据结构时。
  • 如果迭代逻辑非常复杂,可以考虑使用访问者模式来进一步分离逻辑和数据结构。

迭代器模式是一种强大的工具,可以使代码更加清晰、灵活,并且易于维护。文章来源地址https://www.toymoban.com/news/detail-847936.html

到了这里,关于设计模式:迭代器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式 ~ 迭代器模式

    迭代器是一种设计模式,提供了一种顺序访问集合或容器中元素的方法,无需暴露集合的内部结构,for 循环并不是迭代器模式 ,forEach 是最简易的迭代器。 以下函数实现了 next 方法,调用该方法返回集合中的下一个元素 value 表示当前迭代到的元素值 done 表示迭代是否已经结

    2024年02月16日
    浏览(27)
  • 设计模式:迭代器模式

    迭代器模式的示例可以涵盖各种数据结构的遍历,包括数组、列表、树、图等。下面是一些不同场景下迭代器模式的示例及其代码实现。 示例 1: 数组遍历 使用迭代器模式遍历数组。 示例 2: 二叉树的深度优先遍历 二叉树的深度优先遍历(使用栈实现)。 示例 3: 分页遍历 在

    2024年04月11日
    浏览(38)
  • 设计模式-迭代器模式

      迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆

    2024年02月05日
    浏览(39)
  • 设计模式——迭代器模式

    它提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。 迭代器是为容器服务的,能容纳元素的对象可以称为容器,例:List、Set、Map 迭代器模式(Iterator Pattern)已经是没落的设计模式,常用的容器基本都有成熟稳定的实现,基本不会再去单独写一

    2024年02月13日
    浏览(30)
  • 设计模式浅析(十) ·设计模式之迭代器&组合模式

    日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 案例 有两家门店,门店A呢只提供早餐,门店B呢只提供午餐,有一天这两家店铺想要进行合并,一起做大做强,再创辉煌。 合并后呢,对于菜单的定制存在了一定的问题: 门店A的

    2024年04月11日
    浏览(37)
  • 设计模式——迭代器模式15

    迭代器模式提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 设计模式,一定要敲代码理解 迭代器模式将数据存储和数据遍历的职责进行分离。但针对不同结构的迭代对象,迭代方式需进行添加。 代码下载

    2024年04月15日
    浏览(39)
  • 行为型设计模式——迭代器模式

    迭代器模式也是非常的简单, 定义如下: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器: 如果在你的项目中需要对一个自定义的集合进行迭代遍历,那么迭代器模式是非常需要学习的。迭代器模式主

    2024年01月18日
    浏览(29)
  • 设计模式行为型——迭代器模式

    目录 迭代器模式的定义 迭代器模式的实现 迭代器模式角色 迭代器模式类图 迭代器模式代码实现 迭代器模式的特点 优点 缺点 使用场景 注意事项         迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对

    2024年02月14日
    浏览(25)
  • 设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

    上篇文章,我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,以此来避免状态机类中的分支判断逻辑,应对状态机类代码的复杂性。 本章,学习另外一种行为型设计模式,迭代器模式。它用来遍历集

    2024年04月15日
    浏览(44)
  • C++设计模式之迭代器模式

    【声明】本题目来源于卡码网(https://kamacoder.com/) 【提示:如果不想看文字介绍,可以直接跳转到 C++编码部分 】         --什么是迭代器模式(第19种设计模式)          迭代器模式 是⼀种 行为设计模式 ,是⼀种使⽤频率⾮常⾼的设计模式,在各个语⾔中都有应用,

    2024年01月24日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包