likes
comments
collection
share

迭代器模式探究 - 那拗口的定义说的是啥呀

作者站长头像
站长
· 阅读数 18

前言

最近捡起了一直没看完的设计模式

一篇篇理论看过去对我这种菜鸡来说难免如雾里看花

为了学(饭)习(碗),我忍了

看到迭代器模式(Iterator Pattern),我忍不了了

迭代器模式允许我们访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示

迭代器模式探究 - 那拗口的定义说的是啥呀

内部表示是什么鬼?才疏学浅的我只会表示不理解

害,看看英文文档吧

the iterator pattern allow us to access contents of a collection without exposing its internal structure

internal structure ???

迭代器模式探究 - 那拗口的定义说的是啥呀

弃坑!

到底是啥

平复心情后

既然学了,还是弄懂吧

看了看迭代器模式的主要实现示例、使用示例

/*
 * 主要实现
 */
public class NameRepository implements Container {  
    public String[] names = {"Robert", "John", "Julie", "Lora"};  
  
    @Override  
    public Iterator getIterator() {  
        return new NameIterator();  
    }  
  
    private class NameIterator implements Iterator {  
  
        int index;  
  
        @Override  
        public boolean hasNext() {  
            if (index < names.length) {  
                return true;  
            }  
            return false;  
        }  
  
        @Override  
        public Object next() {  
            if (this.hasNext()) {  
                return names[index++];  
            }  
            return null;  
        }  
    }  
}

/*
 * 使用示例
 */
public static void main(String[] args) {  
    Container nameRepository = new NameRepository();  
    Iterator iterator = nameRepository.getIterator();  
    while (iterator.hasNext()) {  
        System.out.println(iterator.next());  
    }  
}

这就是通过 iterator 遍历 names 数组啊。再看一遍文档

the iterator pattern allow us to access contents of a collection without exposing its internal structure

access contents of a collection 当然是指获取 names 中的元素

without exposing its internal structuremain()中确实没有获取 names,但实现了对 names 的遍历

所以

所谓的 internal structure 指的就是这个 names

吗?

结论

先说结论:是的

更专业点的说法:internal structure 是class中保存集合数据的私有成员变量

举例

Java 中很好的实现了 iterator,我们以 java.util.ArrayList、java.util.HashSet 为例

java.util.ArrayList

先看 ArrayList 实现的 iterator 方法

迭代器模式探究 - 那拗口的定义说的是啥呀

可以看到next()最终获取的是 ArrayList.this.elementData 中的元素,再看 ArrayList.this.elementData

迭代器模式探究 - 那拗口的定义说的是啥呀

我们日常开发遍历 ArrayList 时,从没直接操作过 elementData 这个私有变量吧?这个elementData就是 java.util.ArrayList 的 internal structure

java.util.HashSet

我们再看 HashSet 实现的 iterator 方法

迭代器模式探究 - 那拗口的定义说的是啥呀

迭代器模式探究 - 那拗口的定义说的是啥呀

同样的,map就是 java.util.HashSet 的 internal structure。日常开发中,我们使用 set.iterator() 遍历 HashSet,而不是直接操作这个 HashMap 类型的 map

// 遍历HashSet示例

Set<String> set = new HashSet<>();
...
Iterator iterator = set.iterator();

总结

迭代器模式(Iterator)中所谓的“内部表示(internal structure)”,其实就是指class中存储集合数据的private变量

所谓的“无须暴露该对象的内部表示”,就是说仅开发使用的话,我们无需关心这个class内部是怎么维护、怎么来读取集合数据的


感谢阅读,不喜勿喷。欢迎讨论、指正