设计模式之迭代器模式

目录

定义

迭代器模式将集合对象的遍历行为抽象为独立的迭代器对象,通过统一的接口(如 hasNext()、next())实现元素访问,使客户端无需关心底层数据结构。本质是分离集合的迭代逻辑与业务逻辑,实现‌遍历算法与数据结构的解耦‌,提升代码复用性和扩展性。

结构

适用场景

1)‌隐藏复杂数据结构。当集合内部采用树、图等复杂结构时,迭代器封装遍历细节,简化客户端调用‌。

2)‌统一遍历接口。需对多种集合(数组、链表、字典)执行相同操作时,提供一致的遍历方式‌。

3)‌支持多种遍历方式。如正序、倒序、过滤遍历等,无需修改集合代码‌。

4)‌跨集合操作。需同时遍历多个独立集合时(如合并查询),迭代器提供统一入口。

使用示例

复制代码
/**
 * 统一迭代器接口
 * @param <T>
 */
public interface Iterator<T> {

    boolean hasNext();

    T next();
}

/**
 * 统一集合接口
 * @param <T>
 */
public interface Container<T> {

    Iterator<T> createIterator();

}

/**
 * 数组集合实现
 */
public class ArrayCollection implements Container<String> {

    private String[] items;

    public ArrayCollection(String[] items) {
        this.items = items;
    }

    @Override
    public Iterator<String> createIterator() {
        return new ArrayIterator();
    }

    private class ArrayIterator implements Iterator<String> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < items.length;
        }

        @Override
        public String next() {
            return items[index++];
        }
    }
}

/**
 * 链表集合实现
 */
public class ListCollection implements Container<String> {

    private List<String> items;

    public ListCollection(List<String> items) {
        this.items = items;
    }

    @Override
    public Iterator<String> createIterator() {
        return new ListIterator();
    }

    private class ListIterator implements Iterator<String> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < items.size();
        }

        @Override
        public String next() {
            return items.get(index++);
        }
    }
}

测试

复制代码
import java.util.Arrays;

public class Client {

    public static void printAll(Iterator<String> iterator) {
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    public static void main(String[] args) {
        String[] firstAggregate = new String[]{"语文", "数学", "物理", "化学", "英语"};
        Container<String> array = new ArrayCollection(firstAggregate);
        Container<String> list = new ListCollection(Arrays.asList("毛泽东", "秦始皇", "汉武帝", "隋文帝", "朱元璋", "刘邦", "唐太宗"));

        System.out.println("数组集合遍历:");
        printAll(array.createIterator());

        System.out.println("\n链表集合遍历:");
        printAll(list.createIterator());
    }

}
相关推荐
奶油松果11 小时前
Springboot自动装配 - redis和redission
java·spring boot·redis
霍夫曼11 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
VX:Fegn089511 小时前
计算机毕业设计|基于Java人力资源管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·课程设计
荔枝hu11 小时前
springboot和shiro组合引入SseEmitter的一些坑
java·spring boot·后端·sseeitter
老华带你飞12 小时前
健身房|基于springboot + vue健身房管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JIngJaneIL12 小时前
基于Java酒店预约系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
曹牧12 小时前
Java:List<Map<String, String>>转换为字符串
java·开发语言·windows
Unstoppable2213 小时前
代码随想录算法训练营第 56 天 | 拓扑排序精讲、Dijkstra(朴素版)精讲
java·数据结构·算法·
qinyia13 小时前
WisdomSSH解决docker run命令中log-opt参数不支持导致的容器创建失败问题
java·docker·eureka
电饭叔13 小时前
不含Luhn算法《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之二(识别卡号有效)
java·python·算法