23种设计模式之迭代器模式

目录

  • [1. 简介](#1. 简介)
  • [2. 代码](#2. 代码)
    • [2.1 Iterator (迭代器接口)](#2.1 Iterator (迭代器接口))
    • [2.2 Container (聚合对象接口)](#2.2 Container (聚合对象接口))
    • [2.3 NameContainer(具体迭代器+具体聚合对象)](#2.3 NameContainer(具体迭代器+具体聚合对象))
    • [2.4 Test(测试)](#2.4 Test(测试))
    • [2.5 运行结果](#2.5 运行结果)
  • [3. 使用场景](#3. 使用场景)
  • [4. 优缺点](#4. 优缺点)
  • [5. 总结](#5. 总结)

1. 简介

迭代器模式(Iterator Pattern) 是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象(如数组、列表、树等各种集合类型)中的各个元素,而又不暴露该对象的内部表示。

简单来说,就像是给一个装满东西的盒子(聚合对象)配备了一个工具(迭代器),通过这个工具可以逐个拿出盒子里的东西,并且不需要知道盒子内部是怎么摆放这些东西的。

结构组成

  • 迭代器(Iterator)接口
    定义了访问和遍历元素的接口,通常包括hasNext()和next()等方法。hasNext()用于判断是否还有下一个元素,next()用于返回下一个元素。
  • 具体迭代器(Concrete Iterator)
    实现迭代器接口,负责具体的遍历算法。它要记录当前遍历的位置等状态信息。
  • 聚合对象(Aggregate)接口
    定义了创建迭代器的接口方法,通常是createIterator()之类的方法。它表示可以被遍历的对象集合。
  • 具体聚合对象(Concrete Aggregate)
    实现聚合对象接口,它包含了实际的元素集合,并实现创建迭代器的方法,返回一个具体的迭代器对象。

2. 代码

2.1 Iterator (迭代器接口)

java 复制代码
public interface Iterator {
    public boolean hasNext();
    public Object next();
}

2.2 Container (聚合对象接口)

java 复制代码
public interface Container {
    public Iterator getIterator();
}

2.3 NameContainer(具体迭代器+具体聚合对象)

java 复制代码
public class NameContainer implements Container{
    public String names[]={"Ram","Shyam","Mohan"};
    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator{
        int index;
        @Override
        public boolean hasNext() {
            return index<names.length;
        }

        @Override
        public Object next() {
            return names[index++];
        }
    }
}

2.4 Test(测试)

java 复制代码
public class Test {
    public static void main(String[] args) {
        NameContainer nameContainer = new NameContainer();
        Iterator iterator = nameContainer.getIterator();
        while (iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
    }
}

2.5 运行结果

复制代码
Ram
Shyam
Mohan

3. 使用场景

  • 访问聚合对象的内容而不暴露其内部结构
    比如,在一个复杂的图形绘制系统中,有一个图形集合(可能包括圆形、矩形等多种图形)。通过迭代器模式,可以方便地遍历这个图形集合来进行绘制操作,而不用关心图形集合内部是如何存储这些图形的(是用数组、链表还是其他数据结构)。
  • 支持多种遍历方式
    对于一个二叉树结构的数据集合,可以实现不同的迭代器来进行前序遍历、中序遍历、后序遍历等。这样在需要不同遍历顺序的场景下(如查找特定节点、计算树的高度等),可以灵活地使用不同的迭代器。

4. 优缺点

  • 优点
    • 分离了聚合对象的遍历行为和存储结构
      使得聚合对象的内部结构可以自由变化,而只要迭代器接口不变,外部使用迭代器的代码就不需要修改。例如,将一个数组存储的集合改为链表存储,只要更新具体聚合对象中的创建迭代器方法,让它返回适合链表遍历的迭代器即可,其他使用迭代器的部分代码不受影响。
    • 单一职责原则的体现
      迭代器专注于遍历元素,聚合对象专注于存储元素,使得每个类的职责更加清晰。这样代码的可维护性和可扩展性都得到了提高。
  • 缺点
    • 增加了类的数量
      因为需要定义迭代器接口、具体迭代器、聚合对象接口和具体聚合对象等多个类,对于简单的应用场景可能会显得有些繁琐。
    • 遍历过程可能比较复杂时,实现迭代器的代码会变得复杂
      例如,对于一个具有复杂嵌套结构的集合(如多层嵌套的树形结构),实现一个能够正确遍历所有元素的迭代器可能会涉及到较多的递归或者状态维护代码。

5. 总结

相关推荐
HelloWord~8 分钟前
SpringSecurity+vue通用权限系统2
java·vue.js
让我上个超影吧9 分钟前
黑马点评【基于redis实现共享session登录】
java·redis
liang_jy22 分钟前
观察者模式
设计模式·面试
BillKu1 小时前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥1 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
chxii1 小时前
12.7Swing控件6 JList
java
全栈凯哥1 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
YuTaoShao1 小时前
Java八股文——集合「List篇」
java·开发语言·list
PypYCCcccCc1 小时前
支付系统架构图
java·网络·金融·系统架构
华科云商xiao徐1 小时前
Java HttpClient实现简单网络爬虫
java·爬虫