java设计模式--迭代器设计模式


#

迭代器模式

迭代器模式(Iterator Pattern)是一种非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。

介绍

意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部结构。

解决: 不同的方式来遍历整个整合对象。

设计思想: 把在元素之间游走的责任交给迭代器,而不是聚合对象。

接口包含 :hasNext, next。

优点: 1、支持不同的方式来遍历对象。 2、简化了java内部结构。 3、在一个类中可以有多个迭代器。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

使用场景: 1、不暴露类中的底层机构。 2、需要为类提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。

思想: 迭代器模式分离了集合对象的遍历行为和数据存储行为,将两个行为分开,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

JDK中典型使用了迭代器设计模式的是集合类(List,set),下面对ArrayList进行分析,实现步骤:

1. 定义一个迭代器接口,里面包含迭代器最基本的方法。

2. 在集合的实现类(ArrayList)中,定义一个内部类实现迭代器接口,并用private作用类的修饰符(保证此类对外不可见)。

3. 对外提供迭代器接口的引用。

// 迭代器对外访问实现
    public java.util.Iterator<E> iterator() {
        return new ArrayList.Itr();
    }

    /**
     * 遍历行为,private修饰符,对外不可见。
       实现了迭代器接口
     */
    private class Itr implements java.util.Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        // 判断是否存在下个元素
        public boolean hasNext() {
            return cursor != size;
        }

        // 获取下一个元素
        public E next() {
            //...
            return (E) elementData[lastRet = i];
        }

        // 移除迭代器中的元素
        public void remove() {
            //...
        }

    }

栗子:

1. 创建接口:

package itereatorTest;

public interface Container {
    Iterator getIterator();
}



package itereatorTest;

public interface Iterator {

    boolean hasNext();

    Object next();
}

2. 创建container接口的实现类,实现类内部类IteratorImpl现实现了迭代器Iterator

package itereatorTest;

public class ContainerImpl implements Container{
    String [] names = {"zhangsan","lisi","wanger","zhaowu"};

    @Override
    public Iterator getIterator() {
        return new IteratorImpl();
    }

// 内部类,实现了迭代器接口
    private class  IteratorImpl implements Iterator{
        int index;
        @Override
        public boolean hasNext() {
            return index < names.length;
        }

        @Override
        public Object next() {
           if (this.hasNext()) {
                return names[index++];
           }
           return null;
        }
    }
}

3. 测试类

package itereatorTest;
// 测试类
public class MainTest {

    public static void main(String[] args) {
        Container container = new ContainerImpl();
        Iterator iterator = container.getIterator();
        while (iterator.hasNext()) {
            System.out.println("name :" +iterator.next());
        }
    }
}

4. 测试结果:

name :zhangsan
name :lisi
name :wanger
name :zhaowu


原文链接:https://blog.csdn.net/q54244125/article/details/81318323