17、迭代器模式(Iterator Pattern)

迭代器模式提供了顺序访问集合对象中的各种元素,而不暴露该对象内部结构的方法。如Java中遍历HashMap。

迭代器模式将遍历集合中所有元素的操作封装成迭代器类,其目的是在不暴露集合对象内部结构的情况下,对外提供统一访问集合的内部数据的方法。迭代器的实现一般包括一个迭代器,用于执行具体的遍历操作;一个Collection,用于存储具体的数据。Collection集合的迭代器UML设计图:

1)Collection接口:

java 复制代码
package cn.jaa.iterator_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/5 23:02
 */
public interface Collection {
    // 对集合元素的迭代
    public Iterator iterator();
    // 获取集合元素
    public Object get(int i);
    // 向添加元素
    public boolean add(Object obj);
    // 获取集合的大小
    public int size();
}

2)Collection接口实现类ListCollection:

java 复制代码
package cn.jaa.iterator_pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: Jaa
 * @Description: Collection接口实现类ListCollection
 * @Date 2023/12/5 23:07
 */
public class ListCollection implements Collection {

    public List list = new ArrayList();

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }

    @Override
    public Object get(int i) {
        return list.get(i);
    }

    @Override
    public boolean add(Object obj) {
        list.add(obj);
        return true;
    }

    @Override
    public int size() {
        return list.size();
    }
}

3)迭代器接口Iterator:

java 复制代码
package cn.jaa.iterator_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/5 23:08
 */
public interface Iterator {
    // 前移指针
    public Object previous();
    // 后移指针
    public Object next();
    public boolean hasNext();
}

4)Iterator的实现类ConcreteIterator:

java 复制代码
package cn.jaa.iterator_pattern;

/**
 * @Author: Jaa
 * @Description: Iterator的实现类ConcreteIterator
 * @Date 2023/12/5 23:10
 */
public class ConcreteIterator implements Iterator {

    private Collection collection;
    // 当前迭代器遍历到的元素位置
    private int pos = -1;

    public ConcreteIterator(Collection collection) {
        this.collection = collection;
    }

    @Override
    public Object previous() {
        if (pos > 0) {
            pos--;
        }
        return collection.get(pos);
    }

    @Override
    public Object next() {
        if (pos < collection.size() - 1) {
            pos++;
        }
        return collection.get(pos);
    }

    @Override
    public boolean hasNext() {
        if (pos < collection.size() - 1) {
            return true;
        } else {
            return false;
        }
    }
}

5)测试迭代器模式:

java 复制代码
package cn.jaa.iterator_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/5 23:19
 */
@Slf4j
public class IteratorDemoTest {

    public static void main(String[] args) {
        Collection collection = new ListCollection();
        collection.add("obj1");
        collection.add("obj2");
        collection.add("obj3");
        Iterator it = collection.iterator();
        while (it.hasNext()) {
            log.info((String) it.next());
        }
    }
}

打印结果:

相关推荐
蓝瑟6 小时前
告别重复造轮子!业务组件多场景复用实战指南
前端·javascript·设计模式
Arva .9 小时前
讲一下 Spring 中用到的设计模式
java·spring·设计模式
繁华似锦respect10 小时前
lambda表达式中的循环引用问题详解
java·开发语言·c++·单例模式·设计模式·哈希算法·散列表
星月IWJ13 小时前
领域驱动设计学习
java·学习·设计模式
_dindong14 小时前
Linux网络编程:Reactor反应堆模式
linux·服务器·网络·设计模式·php
雨中飘荡的记忆15 小时前
Step Builder模式实战
java·设计模式
Eren7Y琳15 小时前
开箱即用构建应用环境:openEuler易获得性深度验证
redis·设计模式·架构
Unstoppable2215 小时前
八股训练营第 39 天 | Bean 的作用域?Bean 的生命周期?Spring 循环依赖是怎么解决的?Spring 中用到了那些设计模式?
java·spring·设计模式
闲人编程16 小时前
微服务API网关设计模式
python·缓存·微服务·设计模式·系统安全·api·codecapsule
__万波__16 小时前
二十三种设计模式(八)--装饰器模式
java·设计模式·装饰器模式