当前位置: 首页 > news >正文

设计模式——迭代器模式

设计模式——迭代器模式

定义: 提供一个对象来顺序访问聚合对象中的一系列数据且不暴露聚合对象的内部

结构:

  1. 抽象聚合: 定义存储, 添加, 删除聚合元素以及创建迭代器对象的接口
  2. 具体聚合: 实现抽象聚合类, 返回一个具体迭代器的实例
  3. 抽象迭代器: 定义访问和遍历聚合元素的接口, 通常包含haseNext(), next()方法
  4. 具体迭代器: 实现抽象迭代器接口中所定义的方法, 完成对聚合对象的遍历, 记录遍历的当前位置

实现

抽象聚合

public interface Aggregate<T> {

    void add(T obj);

    void remove(T obj);

    Iterator<T> getIterator();

}

具体聚合

@Data
@AllArgsConstructor
public class Student {

    private String name;

    private String number;

}

public class StudentAggregateImpl implements Aggregate<Student> {

    private List<Student> list = new ArrayList<Student>();

    public void add(Student obj) {
        list.add(obj);
    }

    public void remove(Student obj) {
        list.remove(obj);
    }

    public Iterator<Student> getIterator() {
        return new StudentIteratorImpl(list);
    }
}

抽象迭代

public interface Iterator<T> {

    boolean hasNext();

    T next();

}

具体迭代

public class StudentIteratorImpl implements Iterator<Student> {

    private List<Student> list;

    // 记录遍历时的位置
    private int position = 0;

    public StudentIteratorImpl(List<Student> list) {
        this.list = list;
    }

    public boolean hasNext() {
        return position < list.size();
    }

    public Student next() {
        return list.get(position++);
    }
}

Main

/**
 * 迭代器模式
 * 优点:
 * 1. 支持以不同方式遍历一个聚合对象, 同一个聚合对象可以定义多种遍历方式,
 * 迭代器模式中只需要换一个迭代器即可改变遍历算法
 * 2. 迭代器简化了聚合类, 引入了迭代器原有的聚合对象不需要再提供遍历方法
 * 3. 由于引入了抽象层, 增加聚合类和迭代器都方便, 不需要修改源代码
 *
 * 缺点:
 * 1. 增加类个数, 系统复杂性升高
 */
public class Main {
    public static void main(String[] args) {
        Aggregate<Student> aggregate = new StudentAggregateImpl();
        aggregate.add(new Student("wtw", "123"));
        aggregate.add(new Student("pk", "456"));
        Iterator<Student> iterator = aggregate.getIterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

使用场景:

  1. 需要为聚合对象提供多种遍历方式时
  2. 需要为不同的聚合对象提供一个统一的接口时
  3. 访问聚合对象但不需要暴露其内部细节时

相关文章:

  • STM32F407的时钟
  • Opencv形态学——腐蚀、膨胀、开运算与闭运算、梯度运算、礼帽、黑帽
  • [Django开源学习 1]django-vue-admin
  • JavaEE初阶:网络编程套接字
  • JAVA猎才学员成长心得分享
  • 2022年0903我的SpringBoot框架入门的第一个程序
  • 【高阶数据结构】并查集的实现(含压缩路径)及其应用-C++版本
  • Java——线程不安全的原因(图解)
  • [数据结构]~双向+循环链表从(0~1)
  • 【开学季】再见大一,你好大二 | 完成自己的未完成
  • java毕业设计网站SSM版学生选课系统[包运行成功]
  • 【计算机网络】第六章:应用层
  • FS03MR12A6MA1LBBPSA1 1200V 400A 紧凑型 六单元模块
  • 系统篇: ubuntu 18.04 ROS1 和 ROS2 环境搭建
  • 贪心算法 - 买卖股票的最佳时机|| + 分割平衡字符串
  • 《剑指offer》分解让复杂问题更简单
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • gulp 教程
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript函数式编程(一)
  • JavaScript实现分页效果
  • JS+CSS实现数字滚动
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • nodejs调试方法
  • WebSocket使用
  • 电商搜索引擎的架构设计和性能优化
  • 技术发展面试
  • 爬虫模拟登陆 SegmentFault
  • 一个SAP顾问在美国的这些年
  • 赢得Docker挑战最佳实践
  • 整理一些计算机基础知识!
  • ​插件化DPI在商用WIFI中的价值
  • ​你们这样子,耽误我的工作进度怎么办?
  • #1015 : KMP算法
  • #vue3 实现前端下载excel文件模板功能
  • #大学#套接字
  • (06)金属布线——为半导体注入生命的连接
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (转)ORM
  • .NET MVC第三章、三种传值方式
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net快速开发框架源码分享
  • .net网站发布-允许更新此预编译站点
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .so文件(linux系统)
  • /etc/motd and /etc/issue
  • ?php echo ?,?php echo Hello world!;?
  • @EnableConfigurationProperties注解使用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [<MySQL优化总结>]