大话设计模式十八:迭代器模式

一.模式定义

迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
Iterator Pattern: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

 

二.模式要素

Iterator: 抽象迭代器
ConcreteIterator: 具体迭代器
Aggregate: 抽象聚合类
ConcreteAggregate: 具体聚合类

 

三.举例说明

假设有一个容器存放着电视节目。需要一个迭代器来读取该容器中的所有电视节目。

大话设计模式十八:迭代器模式_第1张图片

 

四.具体代码

IIterator.java  迭代器接口

package iteratorPattern;

/**
 * @program: Test
 * @description:
 * @author: Lei Dong
 * @create: 2019-05-04 21:11
 **/
public interface IIterator {
    public boolean hasNext();

    public Object next();
}

ConcreteIterator.java  具体迭代器

package iteratorPattern;

/**
 * @program: Test
 * @description:
 * @author: Lei Dong
 * @create: 2019-05-04 21:12
 **/
public class ConcreteIterator implements IIterator {
    int cursor = 0;
    String[] channels;

    public ConcreteIterator(String[] channels) {
        this.channels = channels;
    }

    @Override
    public boolean hasNext() {
        return cursor < channels.length;
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return channels[cursor++];
        }
        return null;
    }
}

IContainer.java  容器接口

package iteratorPattern;

/**
 * @program: Test
 * @description:
 * @author: Lei Dong
 * @create: 2019-05-04 21:19
 **/
public interface IContainer {
    public IIterator getIterator();
}

ConcreteContainer.java  具体容器

package iteratorPattern;

/**
 * @program: Test
 * @description:
 * @author: Lei Dong
 * @create: 2019-05-04 21:20
 **/
public class ConcreteContainer implements IContainer {
    private String[] channels = {"CCTV-1", "CCTV-2", "CCTV-3", "CCTV-4", "CCTV-5"};

    @Override
    public IIterator getIterator() {
        return new ConcreteIterator(channels);
    }
}

Main.java

package iteratorPattern;

/**
 * @program: Test
 * @description:
 * @author: Lei Dong
 * @create: 2019-05-04 20:31
 **/
public class Main {
    public static void main(String[] args) {

        IContainer container = new ConcreteContainer();
        IIterator iterator = container.getIterator();

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

运行结果:

大话设计模式十八:迭代器模式_第2张图片

 

五.总结

1.迭代器模式的优点
(1)它支持以不同的方式遍历一个聚合对象。
(2)迭代器简化了聚合类。
(3)在同一个聚合上可以有多个遍历。
(4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。

2.迭代器模式的缺点

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

3.模式适用场景

(1)访问一个聚合对象的内容而无须暴露它的内部表示。
(2)需要为聚合对象提供多种遍历方式。
(3)为遍历不同的聚合结构提供一个统一的接口。

你可能感兴趣的:(设计模式)