• 设计模式- 迭代器模式(Iterator Pattern)结构|原理|优缺点|场景|示例


    迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种方法来顺序访问聚合对象(容器)中的元素,而又不暴露其实现细节。通过使用迭代器,用户可以从不同类型的聚合对象中以统一的方式遍历元素,而无需了解聚合物的内部结构或其存储方式。

    结构:

    • Iterator(迭代器)接口: 定义了访问和遍历元素所需的抽象方法,如 hasNext()(是否有下一个元素)、next()(获取下一个元素)等。
    • ConcreteIterator(具体迭代器): 实现了迭代器接口,跟踪当前的遍历位置,并通过与聚合物的具体实现协作来提供对下一个元素的访问。
    • Aggregate(聚合)接口/抽象类: 定义了创建迭代器对象的接口方法,如 createIterator()
    • ConcreteAggregate(具体聚合): 具体的聚合类,提供了具体的元素存储结构,并实现了创建相应迭代器的方法。

    原理:

    迭代器模式的工作原理在于,它为聚合对象提供了一种标准的方式来访问内部元素,而无需暴露任何内部的数据结构。通过使用迭代器,用户可以通过简单的接口控制遍历过程,比如逐个获取元素,直到遍历结束。

    优缺点:

    • 优点
      • 封装性好,隐藏了集合内部表示,简化了客户端代码。
      • 提供了统一的遍历各种聚合结构的方法,易于扩展和替换不同的数据结构。
      • 支持多种遍历方式,如正向、反向遍历等。
    • 缺点
      • 对于不同的聚合结构,可能需要编写不同的迭代器,增加了类的数量。
      • 迭代器模式只提供了一种线性访问方式,复杂的随机访问可能需要额外的设计。
      • 如果迭代器本身比较复杂,可能会增加系统的理解难度和维护成本。

    场景:

    • 当需要遍历集合、数组或其他容器中的元素时。
    • 当希望提供多种遍历方式(顺序、条件等)时。
    • 在不希望暴露集合内部结构或实现细节的情况下,对外提供一致的访问接口。

    代码示例(以Java为例)

     

    1. // 聚合接口
    2. public interface Collection {
    3. Iterator createIterator();
    4. }
    5. // 具体聚合类
    6. public class ConcreteCollection implements Collection {
    7. private Object[] items;
    8. public Iterator createIterator() {
    9. return new ConcreteIterator(this);
    10. }
    11. // ... 其他实现细节 ...
    12. }
    13. // 迭代器接口
    14. public interface Iterator {
    15. boolean hasNext();
    16. Object next();
    17. }
    18. // 具体迭代器类
    19. public class ConcreteIterator implements Iterator {
    20. private Collection collection;
    21. private int position = 0;
    22. public ConcreteIterator(Collection collection) {
    23. this.collection = collection;
    24. }
    25. @Override
    26. public boolean hasNext() {
    27. return position < collection.size();
    28. }
    29. @Override
    30. public Object next() {
    31. if (!hasNext()) {
    32. throw new NoSuchElementException();
    33. }
    34. return collection.getItem(position++);
    35. }
    36. // ... 其他实现细节 ...
    37. }
    38. // 使用示例
    39. public class Client {
    40. public static void main(String[] args) {
    41. Collection col = new ConcreteCollection();
    42. // ... 初始化集合 ...
    43. Iterator it = col.createIterator();
    44. while (it.hasNext()) {
    45. Object item = it.next();
    46. System.out.println(item);
    47. }
    48. }
    49. }
  • 相关阅读:
    1285. 找到连续区间的开始和结束数字
    2022年SQL经典面试题总结(带解析)
    【云原生 | 10】Docker数据管理
    B3614 【模板】栈
    C#调用C++生成的DLL 找不到入口点 以及 尝试读取或写入受保护的内存
    bug的生命周期都有那些阶段
    Android 中USB-HID协议实现
    【附源码】Python计算机毕业设计水库洪水预报调度系统
    为什么很多同学蓝桥杯竞赛入不了门?
    BBR 会取代 CUBIC 吗?
  • 原文地址:https://blog.csdn.net/piaomiao_/article/details/138190855