前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抽丝剥茧——迭代器设计模式

抽丝剥茧——迭代器设计模式

作者头像
石的三次方
发布2021-01-05 22:31:13
2340
发布2021-01-05 22:31:13
举报
文章被收录于专栏:石的三次方石的三次方

迭代器设计模式

兄弟们好,今天我们来学习一下迭代器设计模式。迭代器这三个字应该很熟悉吧。在我们学习Java集合的时候,采用的遍历集合的方式就是通过迭代器实现的。

那么为什么要使用这个设计模式呢?

「这个设计模式的目的是为了对所有的集合容器都可以采用同一种方式进行遍历而制定的。」

我们来一个场景,引申出这个设计模式

「这是我自己写的一个ArrayList有一个简单的增加和删除的功能」

代码语言:javascript
复制
class ArrayList_{
    Object[] objects = new Object[16] ;

    int size = 0 ;

    public void add(Object object){
        if(objects.length < size){
            Object[] newObjects = new Object[objects.length*2];
            System.arraycopy(objects,0,newObjects,0,objects.length);
            objects = newObjects ;
        }else{
            objects[size] = object ;
            size++;
        }
    }

    public Object remove(){
        Object object = objects[size];
        objects[size] = null ;
        size--;
        return object ;
    }
}

我们需要对其遍历的时候,直接可以通过一个for循环解决,而如果我们仿照LinkedList出现一个容器的时候,那我们该如何遍历呢?那个时候,一个for循环无法实现对两个容器一起进行遍历,所以我们需要引入一个帮助我们进行遍历的东东,这个东东就是「迭代器」

「我们定义一个迭代器,有这个迭代器以后,就可以让每一个需要进行遍历的容器自己去实现该迭代器接口,重写内部的方法,进行不同方式的遍历。这样也就实现了一个对所有容器进行遍历的需求。」

代码语言:javascript
复制
interface Iterator_{
    boolean hasNext();
    Object next();
}

「我们可以仿照JDK的设计,在每一个集合内部提供一个方法,用来获取该迭代器对象,修改以后代码如下:」

代码语言:javascript
复制
class ArrayList_{
    Object[] objects = new Object[16] ;

    int size = 0 ;

    public void add(Object object){
        if(objects.length < size){
            Object[] newObjects = new Object[objects.length*2];
            System.arraycopy(objects,0,newObjects,0,objects.length);
            objects = newObjects ;
        }else{
            objects[size] = object ;
            size++;
        }
    }

    public Object remove(){
        Object object = objects[size];
        objects[size] = null ;
        size--;
        return object ;
    }

    public Iterator_ iterator(){
        return new ListIterator_();
    }

    private class ListIterator_ implements Iterator_{
        int currentIndex = 0 ;

        @Override
        public boolean hasNext() {
            if(currentIndex <= size){
                return true ;
            }
            return false;
        }

        @Override
        public Object next() {
            return objects[currentIndex++];
        }
    }
}

搞明白,迭代器设计模式做了什么以后,我们来看一下他的类图实现和对应的角色

迭代器设计模式角色:

  • 抽象容器。定义了容器的基本方法和迭代方法
  • 具体容器。对容器的方法进行具体的实现
  • 抽象迭代器。定义容器遍历的基本方法
  • 具体迭代器。定义不同容器的不同遍历方法。

好啦,今天的设计模式就到这里了。明天也要元气满满哦。(这话好骚)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迭代器设计模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档