行为型设计模式之迭代器模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型设计模式之迭代器模式相关的知识,希望对你有一定的参考价值。

迭代器模式

应用场景

1、访问一个集合对象的内容而无需暴露它的内部表示;

2、为遍历不同的集合结构提供一个统一的访问接口。

3、需要为聚合对象提供多种遍历方式。

主要角色

1.抽象迭代器(Iterator)

2.具体迭代器(Concretelterator)

3.抽象容器(Aggregate)

4.具体容器(ConcreteAggregate)

优缺点

优点:

1.多态迭代:为不同的聚合结构提供一致的遍历接口,即一个迭代接口可以访问不同的集合对象

2.简化集合对象接口:迭代器模式将集合对象本身应该提供的元素迭代接口抽取到了迭代器中,使集合对象无须关心具体迭代行为;

3.元素迭代功能多样化:每个集合对象都可以提供一个或多个不同的迭代器,使的同种元素聚合结构可以有不同的迭代行为;

4.解耦迭代与集合:迭代器模式封装了具体的迭代算法,迭代算法的变化,不会影响到集合对象的架构。

缺点

1.对于比较简单的遍历(数组或者有序列表),使用迭代器方式遍历较为繁琐

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

迭代器模式的基本使用

创建抽象迭代器

public interface Iterator<E> 
    E next();
    boolean hasNext();

创建具体迭代器

public class ConcreteIterator<E> implements Iterator<E> 
    private List<E> list;
    private int cursor = 0;

    public ConcreteIterator(List<E> list) 
        this.list = list;
    

    public E next() 
        System.out.print("当前游标位置:" + cursor+" 对于元素:");
        return this.list.get(this.cursor ++);
    

    public boolean hasNext() 
        return this.cursor < this.list.size();
    

创建抽象容器

public interface IAggregate<E> 
    boolean add(E element);

    boolean remove(E element);
    Iterator<E> iterator();

创建具体容器

public class ConcreteAggregate<E> implements IAggregate<E> 
    private List<E> list = new ArrayList<E>();

    public boolean add(E element) 
        return this.list.add(element);
    

    public boolean remove(E element) 
        return this.list.remove(element);
    

    public Iterator<E> iterator() 
        return new ConcreteIterator<E>(this.list);
    

客户端执行

public class Test 
    public static void main(String[] args) 
        // 创建容器对象
        IAggregate<String> aggregate = new ConcreteAggregate<String>();
        // 添加元素
        aggregate.add("A");
        aggregate.add("B");
        aggregate.add("C");
        aggregate.add("D");
        aggregate.add("E");
        aggregate.add("F");
        aggregate.add("G");

        Test.testIterator(aggregate);

        System.out.println("==================================================");

        aggregate.remove("D");
        aggregate.remove("E");
        Test.testIterator(aggregate);
    

    public static void testIterator(IAggregate<String> aggregate) 
        // 获取容器对象迭代器
        Iterator<String> iterator = aggregate.iterator();
        // 遍历获取元素
        while (iterator.hasNext()) 
            String element = iterator.next();
            System.out.println(element);
        
    

当前游标位置:0 对于元素:A
当前游标位置:1 对于元素:B
当前游标位置:2 对于元素:C
当前游标位置:3 对于元素:D
当前游标位置:4 对于元素:E
当前游标位置:5 对于元素:F
当前游标位置:6 对于元素:G
==================================================
当前游标位置:0 对于元素:A
当前游标位置:1 对于元素:B
当前游标位置:2 对于元素:C
当前游标位置:3 对于元素:F
当前游标位置:4 对于元素:G

以上是关于行为型设计模式之迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章

20.(行为型模式)java设计模式之迭代器模式

行为型模式之迭代器模式

25行为型模式之迭代器模式

设计模式之行为型迭代器模式

和 lvgo 一起学设计模式(十八)行为型之迭代器模式

23种设计模式之迭代器模式(Iterator)