设计模式——迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问聚合对象中的元素,而又不需要暴露其底层表示。迭代器允许程序员遍历不同的数据结构(如列表、集合或树),而无需了解这些结构的具体实现细节。

原理

  • 迭代器接口(Iterator): 定义了访问和遍历元素所需的接口,通常包含hasNext()、next()等方法。
  • 具体迭代器(Concrete Iterator): 实现迭代器接口,负责跟踪当前遍历位置,并根据需要访问和返回聚合对象的下一个元素。
  • 聚合接口(Aggregate): 提供一个创建迭代器的方法,用于遍历内部元素。
  • 具体聚合类(Concrete Aggregate): 具体实现聚合接口,存储数据并创建与自身数据结构相匹配的迭代器实例。

Java代码示例

java 复制代码
// 聚合接口
public interface Container {
    Iterator<Item> getIterator();
}

// 具体聚合类 - 数组列表容器
public class ArrayListContainer implements Container {
    private Item[] items;

    public ArrayListContainer(Item[] items) {
        this.items = items;
    }

    @Override
    public Iterator<Item> getIterator() {
        return new ArrayListIterator();
    }

    private class ArrayListIterator implements Iterator<Item> {
        private int position = 0;

        @Override
        public boolean hasNext() {
            return position < items.length && items[position] != null;
        }

        @Override
        public Item next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            return items[position++];
        }

        // remove() 方法在此简化示例中未实现
    }
}

// 抽象迭代器接口
public interface Iterator<Item> {
    boolean hasNext();
    Item next();
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        Item[] items = {new Item("A"), new Item("B"), new Item("C")};
        Container container = new ArrayListContainer(items);
        
        Iterator<Item> iterator = container.getIterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

// 简化的元素类
public class Item {
    private String name;

    public Item(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Item: " + name;
    }
}

想象你有一个装满了书的书架,但书架有各种各样的形状和大小。迭代器就像是一个能够帮你找到书架上每本书的图书管理员,不论书架结构如何复杂。每次当你说"下一本"时,图书管理员都能准确地拿出一本书给你,而你并不需要知道书架内部是怎么存放书籍的。

应用场景

  • Java Collections Framework:如ArrayList、LinkedList、HashSet等都实现了Iterable接口,可以通- 过for-each循环或其他方式使用迭代器进行遍历。
  • 数据库查询结果集:数据库驱动程序为查询结果提供迭代器,通过迭代器逐行读取结果数据。

适用性

  • 需要遍历集合对象的所有元素,而不想暴露集合的内部表示时。
  • 支持对集合对象的多种遍历方式,例如正序、逆序或者按照某种特定规则遍历时。
  • 在同一聚合对象上有多个遍历算法的情况下,可以针对每个算法提供一个专门的迭代器类。
相关推荐
云运维笔记3 小时前
Zabbix 分布式监控搭建实战:基于 Proxy 实现 MySQL、Java、Nginx 监控
java·mysql·zabbix
zhanghaha13143 小时前
Python进阶教程:28_queue 队列模块 零基础超详细教程
java·开发语言·python
司小豆3 小时前
第七课:DeepSeek Harness 服务与依赖注入
java·服务器·开发语言·github·ai编程
码匠许师傅4 小时前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml
许彰午4 小时前
24-MyBatisHelper与autoCount
java·低代码·架构
CRMEB系统商城4 小时前
汽车养护连锁的数字化底座CRMEB 多门店系统实战方案
java·开发语言·小程序·开源·汽车
学编程就要猛4 小时前
使用Spring AI配置聊天大模型实现人机交互(初阶)
java·spring ai·advisor·chatclient·chatmodel
代码不停4 小时前
子序列问题
java·算法
计算机学姐4 小时前
基于SpringBoot的高校爱心慈善管理系统
java·vue.js·spring boot·后端·spring·tomcat·mybatis
大梦想家a4 小时前
基于Servlet+JSP的小区物业管理系统设计与实现(Bootstrap+MySQL)
java·servlet·bootstrap