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

345 阅读2分钟

迭代器设计模式

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

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

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

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

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

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循环无法实现对两个容器一起进行遍历,所以我们需要引入一个帮助我们进行遍历的东东,这个东东给就是迭代器

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

interface Iterator_{
    boolean hasNext();
    Object next();
}

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

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++];
        }
    }
}

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

迭代器设计模式角色:

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

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

本文使用 mdnice 排版