前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-10-06-迭代器和组合模式

2022-10-06-迭代器和组合模式

作者头像
三流编程
发布2022-10-08 09:08:55
1290
发布2022-10-08 09:08:55
举报
文章被收录于专栏:三流程序员的挣扎

迭代器模式,遍历用,类似 Java 的 Iterator 接口,提供一种判断是否有下一个和取出下一个的方法。由于 Java 的集合基本已经实现了 Iterator,所以一般不需要自己手动实现。

组合模式,比如 Android 的 View 树就是这东西。对于组合的迭代遍历,比如下面这样

组合模式.png

每个节点内部有个栈,存储迭代器列表,比如 ViewGroup 内部先是自己的迭代器,next 就读到了 ViewGroupA,判断 ViewGroupA 是个组合的话那就把它的迭代器再放到自己的栈里,这样 ViewGroup 再 next 读取的就是 ViewGroupA1,当 hasNext 时判断这迭代器没有 next 了,就是读完 ViewGroupA3 后,就从栈顶移除,再次主动调用一次 hasNext,就又读到栈底原来 ViewGroup 的迭代器了,这样就取得 ViewGroupB 的迭代器。这是深度优先遍历的迭代。

代码语言:javascript
复制
// 自定义的适用于组合的迭代器
public class CompositeIterator implements Iterator {
    Stack stack = new Stack();

    // 传进来一个根节点获取的迭代器
    public CompositeIterator(Iterator iterator) {
        stack.push(iterator);
    }

    public Object next() {
        if (hasNext()) {
            Iterator iterator = (Iterator) stack.peek();
            View viewComponent = (Component)iterator.next();
            if (viewComponent instanceOf ViewGroup) {
                stack.push(viewComponent.createIterator());
            }
            return viewComponent;
        } else {
            return null;
        }
    }

    public boolean hasNext() {
        if (stack.empty()) {
            return false;
        } else {
            Iterator iterator = (Iterator) stack.peek();
            if (!iterator.hasNext()) {
                stack.pop();
                return hasNext();
            } else {
                return true;
            }
        }
    }
}

如果要广度优先,应该是将栈改成队列,每次 next 都从第一层迭代器取,遇到 ViewGroup 后迭代器往队列添加,这样第一层取完后删掉就能读到 ViewGroupA 的迭代器了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档