设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

迭代器模式(Iterator)

是一种行为型模式。

目录

一、概述

1.1、直观的理解装饰模式要干什么:

1.2、主要的角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、举例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

复制代码
1、提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
复制代码
2、当你需要访问一个聚集(合)对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
复制代码
3、当你需要对聚集(合)有多种方式遍历时,可以考虑用迭代器模式。
复制代码
4、为遍历不同的聚集(合)结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
复制代码
5、分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

1.1、直观的理解装饰模式要干什么:

(注,常见的聚合或聚集的对象有:数组、队列、栈、树、图等等)

迭代器几乎在所有面向对象语言中都存在,就比如某些情况下使用for循环遍历数组,它也是用到了迭代器模式,只不过被封装了而已。

1.2、主要的角色:

  • 聚合:++聚合的抽象类或接口++ + ++具体的聚合++
  • 迭代器:++迭代器的抽象类或接口++ + ++具体的迭代器++

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 需要访问一个聚合对象的内容,并且不暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的聚合结构提供一个统一接口,可以更好的使用多态的特性

二、举例

假设要遍历一个动态数组,本例比较简单,你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

聚合的抽象类:

java 复制代码
abstract class Aggregate {
    public abstract Iterator createIterator();//创建迭代器
}

迭代器的抽象类:

java 复制代码
abstract class Iterator {
    public abstract Object first();//获得第一个元素

    public abstract Object next();//获得下一个元素

    public abstract boolean isDone();//判断是否到结尾

    public abstract Object currentItem();//获得当前元素
}

具体的聚合类:

java 复制代码
public class ConcreteAggregate extends Aggregate {
    private ArrayList<Object> items = new ArrayList<>(); //动态数组

    @Override
    public Iterator createIterator() {//创建迭代器
        return new ConcreteIterator(this);
    }

    public int getCount() {//返回聚集里的元素个数
        return items.size();
    }

    public void add(Object o) {//添加新元素
        items.add(o);
    }

    public Object getItemByIndex(int index) {//根据下标返回元素
        return items.get(index);
    }
}

具体的迭代器类:

java 复制代码
public class ConcreteIterator extends Iterator {
    private ConcreteAggregate aggregate;//聚集类
    private int current = 0;//标志当前位置

    public ConcreteIterator(ConcreteAggregate aggregate) {//初始化,将聚集传递给当前迭代器
        this.aggregate = aggregate;
    }

    @Override
    public Object first() {//获得第一个元素
        return aggregate.getItemByIndex(0);
    }

    @Override
    public Object next() {//获得下一个元素
        Object ret = null;
        current++;
        if (current < aggregate.getCount()) {
            ret = aggregate.getItemByIndex(current);
        }
        return ret;
    }

    @Override
    public boolean isDone() {//判断是否到结尾
        return current >= aggregate.getCount();
    }

    @Override
    public Object currentItem() {//获得当前元素
        return aggregate.getItemByIndex(current);
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        //创建聚合
        ConcreteAggregate concreteAggregate = new ConcreteAggregate();
        concreteAggregate.add("张三");
        concreteAggregate.add("李四");
        concreteAggregate.add("王五");
        concreteAggregate.add("老六");
        //创建迭代器
        Iterator iterator = concreteAggregate.createIterator();
        //开始遍历聚合
        iterator.first();
        while (!iterator.isDone()) {
            System.out.println(iterator.currentItem());
            iterator.next();
        }
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
李广坤2 天前
状态模式(State Pattern)
设计模式
李广坤2 天前
观察者模式(Observer Pattern)
设计模式
李广坤2 天前
中介者模式(Mediator Pattern)
设计模式
李广坤2 天前
迭代器模式(Iterator Pattern)
设计模式
李广坤2 天前
解释器模式(Interpreter Pattern)
设计模式
阿无,2 天前
java23种设计模式之前言
设计模式
Asort2 天前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机2 天前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の2 天前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom2 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式