设计模式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可以直接运行。

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

相关推荐
刷帅耍帅1 小时前
设计模式-享元模式
设计模式·享元模式
刷帅耍帅1 小时前
设计模式-模版方法模式
设计模式
刷帅耍帅3 小时前
设计模式-桥接模式
设计模式·桥接模式
MinBadGuy4 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
刷帅耍帅4 小时前
设计模式-生成器模式/建造者模式Builder
设计模式·建造者模式
蜡笔小新..1 天前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞1 天前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3111 天前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3111 天前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..1 天前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则