IT铁人DAY 25-Iterator 迭代器模式

  今天要认识的迭代器模式我个人觉得需要多花一点心思,才能够了解它并善用它,程序当中也算是经常使用的设计模式,现在就一起来认识它吧!


问题情境与解析

  假设现在需要维护一个通知名单的程序,而这个通知名单我们可以将它集合成一个阵列或是其他复杂的数据结构,但无论集合的结构长甚麽样子,它都必须提供某种方式可以遍历集合的所有元素,例如可以是针对一棵树进行深度优先遍历,也可以是广度优先遍历,抑或是随机访问树的元素等等。

  然而可能会因为需求不同而需要不一样的遍历方法添加到集合中,这就会逐渐模糊了集合的主要职,除此之外,由於集合提供了不同遍历元素的方法,因此客户端的程序就需要与特定的集合类别耦合。

  若使用Iterator Pattern,就会将集合的遍历行为封装到一个迭代器的类别中,有多少种遍历方式就有多少个迭代器类别,并且实做相同的介面。而多个迭代器还可以同时遍历同一个集合,彼此独立开来,如果需要一种特殊方法来遍历集合的话,只需要创建一个新的迭代器类别,就不用去更改集合或是客户端的程序。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211010/20140743iQwOmnhdCD.png

Skeleton Code

interface Iterator {
    public boolean hasNext();
    public Object getNext();
}

class ConcreteIterator implements Iterator {
    private Object[] collection;
    private int iteratorIndex = 0;
    
    public ConcreteIterator(Object[] c) {
        collection = c;
    }
    
    public boolean hasNext() {
        // Check the iterator has the next one
    }
    
    public Object getNext() {
        // Get the next object
    }
}

interface Collection {
    public Iterator createIterator();
}

class ConcreteCollection implements Collection {
    Object[] collection;
    
    public Iterator createIterator() {
        return new ConcreteIterator(collection);
    }
}

  若是碰到有集合是属於复杂的数据结构,想要对客户端隐藏其复杂性时,就可以使用迭代器模式来完成,透过适当的迭代器来处理客户端的需求以及集合的元素,有需要的话也能够并行迭代同一个集合,因为每个迭代器物件都有自己的状态,彼此互不影响,而且也实现了开放/封闭原则,新增新的类别也不影响原本的程序,虽然好处多多,但还是要看场合,若是一个简单的集合,使用迭代器也许就有点矫枉过正了。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  【第二六天 - Flutter 知名外送平台画面练习(中)】

>>:  [DAY 25]建立bot抽签功能

Day12:有问题要主动提出来

在初学程序的时候,一定很讨厌例外(Exception)发生,因为程序就没办法跑完了,也代表我们可能有...

Day.12 「来为网页添加动画吧!」 —— CSS 动画(animation)

现在我们会使用具有互动性的简单渐变效果了,接着要来试着让网页能增添更多活力,不需要我们操作,就会自...

Day 4 Matrix capsules with EM routing

前言 接续着昨天讲到的EM routing,今天来将EM routing做进一步的解释 EM rou...

(World N0-1)! To Pass LookML-Developer Exam Guide

50% Discount On Google Updated LookML-Developer Ex...

超级好用的avast删除方法

你想从 Mac 中删除 Avast 吗? 事实上,卸载 Avast 并不像其他程序那麽容易。 许多用...