迭代器模式

news2024/11/19 0:50:45

文章目录

    • 思考迭代器模式
      • 1.迭代器模式的本质
      • 2.何时选用迭代器模式
      • 3.优缺点
      • 4.实现
        • 手动实现迭代器模式
        • java迭代器模式

思考迭代器模式

迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式。如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。

迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即不暴露其内部的结构。

1.迭代器模式的本质

迭代器模式的本质:控制访问聚合对象中的元素。

迭代器模式的功能主要在于提供对聚合对象的迭代访问。迭代器就围绕着这个“访问”做文章,延伸出很多的功能来。比如:

  • 以不同的方式遍历聚合对象,比如向前、向后等。对同一个聚合同时进行多个遍历。
  • 以不同的遍历策略来遍历聚合,比如是否需要过滤等。
  • 多态迭代,含义是:为不同的聚合结构提供统一的迭代接口,也就是说通过一个迭代接口可以访问不同的聚合结构,这就叫做多态迭代。上面的示例就已经实现了多态迭代。事实上,标准的迭代模式实现基本上都是支持多态迭代的。

聚合对象的类型很多,如果对聚合对象的迭代访问跟聚合对象本身融合在一起的话,会严重影响到聚合对象的可扩展性和可维护性。
因此迭代器模式的关键思想就是把对聚合对象的遍历和访问从聚合对象中分离出来,放入单独的迭代器中,这样聚合对象会变得简单一些;而且迭代器和聚合对象可以独立地变化和发展,会大大加强系统的灵活性。

2.何时选用迭代器模式

建议在以下情况中选用迭代器模式。

  • 如果你希望提供访问一个聚合对象的内容,但是又不想暴露它的内部表示的时候,可以使用迭代器模式来提供迭代器接口,从而让客户端只是通过迭代器的接口来访问聚合对象,而无须关心聚合对象的内部实现。

  • 如果你希望有多种遍历方式可以访问聚合对象,可以使用迭代器模式。

  • 如果你希望为遍历不同的聚合对象提供一个统一的接口,可以使用迭代器模式。

3.优缺点

迭代器模式的优点。

  • 更好的封装性
  • 迭代器模式可以让你访问一个聚合对象的内容,而无须暴露该聚合对象的内部表示,从而提高聚合对象的封装性。
  • 可以以不同的遍历方式来遍历一个聚合
  • 使用迭代器模式,使得聚合对象的内容和具体的迭代算法分离开。这样就可以通过使用不同的迭代器的实例、不同的遍历方式来遍历一个聚合对象了,比如上面示例的带迭代策略的迭代器。
  • 迭代器简化了聚合的接口
  • 有了迭代器的接口,则聚合本身就不需要再定义这些接口了,从而简化了聚合的接口定义。
  • 简化客户端调用
  • 迭代器为遍历不同的聚合对象提供了一个统一的接口,使得客户端遍历聚合对象的内容变得更简单。
  • 同一个聚合上可以有多个遍历
  • 每个迭代器保持它自己的遍历状态,比如前面实现中的迭代索引位置,因此可以对同一个聚合对象同时进行多个遍历。

4.实现

在这里插入图片描述

手动实现迭代器模式

一个学院有多个系,计算机学院用数组存的,数学学院用集合存的,其他学院也是有的用数组存,有的用集合存,因为遍历集合和遍历数组的代码不同,遍历所有学院很困难,可以用迭代器模式实现这个效果

在这里插入图片描述

1.迭代器类

/**
 * @description:自己实现的迭代器接口
 */
public interface MyIterator {

    /**
     * 移动到第一个元素
     */
    void first();

    /**
     * 移动到下一个元素
     */
    void next();

    /**
     * 判断是否是最后一个元素
     * @return
     */
    boolean isDone();

    /**
     * 获取当前元素
     * @return
     */
    Object currentItem();
}

/**
 * @description:计算机学院迭代器
 */
public class ComputerIterator implements MyIterator{
    /**
     * 计算机学院对象
     */
    private ComputerCollege computerCollege=null;
    /**
     * 记录索引位置
     */
    private int index=-1;

    public ComputerIterator(ComputerCollege computerCollege) {
        this.computerCollege = computerCollege;
    }

    @Override
    public void first() {
        index=0;
    }

    @Override
    public void next() {
        if (index<this.computerCollege.size()){
            index++;
        }
    }

    @Override
    public boolean isDone() {
        if (index==this.computerCollege.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return this.computerCollege.get(index);
    }
}

/**
 * @description:计算机学院迭代器
 */
public class MathIterator implements MyIterator{

    private MathCollege mathCollege;

    private int index=-1;

    public MathIterator(MathCollege mathCollege) {
        this.mathCollege = mathCollege;
    }

    @Override
    public void first() {
        index=0;
    }

    @Override
    public void next() {
        if (index<this.mathCollege.size()){
            index++;
        }
    }

    @Override
    public boolean isDone() {
        if (index==this.mathCollege.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return this.mathCollege.get(index);
    }
}

2.学院类

/**
 * @description:学院接口
 */
public interface College {

    /**
     * 创建迭代器
     * @return
     */
    MyIterator createIterator();
}

/**
 * @description:计算机学院类
 */
public class ComputerCollege implements College{

    private Department[] departments=null;

    @Override
    public MyIterator createIterator() {
        //初始化数据
        departments=new Department[3];
        departments[0]=new Department(1,"软件");
        departments[1]=new Department(2,"通信");
        departments[2]=new Department(3,"电子");
        return new ComputerIterator(this);
    }

    /**
     * 获取元素
     * @param index
     * @return
     */
    public Object get(int index){
        Object obj=null;
        if (index<this.departments.length){
            obj=departments[index];
        }
        return obj;
    }

    /**
     * 返回学院下系的数量
     * @return
     */
    public int size(){
        return this.departments.length;
    }
}

/**
 * @description:数学学院类
 */
public class MathCollege implements College{

    private List<Department> departmentList=null;

    @Override
    public MyIterator createIterator() {
        //初始化数据
        departmentList=new ArrayList<>();
        departmentList.add(new Department(1,"数学系"));
        departmentList.add(new Department(2,"概率系"));
        departmentList.add(new Department(3,"统计系"));
        return new MathIterator(this);
    }

    /**
     * 获取元素
     * @param index
     * @return
     */
    public Object get(int index){
        Object obj=null;
        if (index<this.departmentList.size()){
            obj=departmentList.get(index);
        }
        return obj;
    }

    /**
     * 返回学院下系的数量
     * @return
     */
    public int size(){
        return this.departmentList.size();
    }
}

3.实体类

/**
 * @description:系
 */
@Data
@AllArgsConstructor
public class Department {

    /**
     * 系id
     */
    private Integer id;
    /**
     * 系名
     */
    private String name;
}

.测试类

/**
 * @description:TODO
 */
public class Client {

    public static void main(String[] args) {
        //计算机学院
        MyIterator citerator = new ComputerCollege().createIterator();
        citerator.first();
        while (!citerator.isDone()){
            Object o = citerator.currentItem();
            System.out.println(o);
            citerator.next();
        }
        System.out.println("==========================================");

        //数学学院
        MyIterator miterator = new MathCollege().createIterator();
        miterator.first();
        while (!miterator.isDone()){
            Object o = miterator.currentItem();
            System.out.println(o);
            miterator.next();
        }
    }
}

java迭代器模式

以计算机学院举例修改

1.修改学院接口,返回为java的Iterator对象

/**
 * @description:学院接口
 */
public interface College {

    /**
     * 创建迭代器
     * @return
     */
    Iterator createIterator();
}

/**
 * @description:计算机学院类
 */
public class ComputerCollege implements College {

    private Department[] departments=null;

    @Override
    public Iterator createIterator() {
        //初始化数据
        departments=new Department[3];
        departments[0]=new Department(1,"软件");
        departments[1]=new Department(2,"通信");
        departments[2]=new Department(3,"电子");
        return new ComputerIterator(this);
    }

    /**
     * 获取元素
     * @param index
     * @return
     */
    public Object get(int index){
        Object obj=null;
        if (index<this.departments.length){
            obj=departments[index];
        }
        return obj;
    }

    /**
     * 返回学院下系的数量
     * @return
     */
    public int size(){
        return this.departments.length;
    }
}

2.迭代器类实现java的Iterator,重写方法

/**
 * @description:计算机学院迭代器
 */
public class ComputerIterator implements Iterator {
    /**
     * 计算机学院对象
     */
    private ComputerCollege computerCollege=null;
    /**
     * 记录索引位置
     */
    private int index=0;

    public ComputerIterator(ComputerCollege computerCollege) {
        this.computerCollege = computerCollege;
    }
    
    @Override
    public boolean hasNext() {
        if(computerCollege!=null&&index<computerCollege.size()){
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        Object obj=null;
        if (hasNext()){
            obj=computerCollege.get(index);
            index++;
        }
        return obj;
    }
}

3.测试,可以看到比自己手动实现简单一些

public class Client2 {

    public static void main(String[] args) {
        Iterator iterator = new ComputerCollege().createIterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用EasyDL制作一个简单的图片识别小项目

主要是利用EasyDL制作一个简单的傻瓜式猫狗图片识别&#xff0c;利用EasyDL&#xff0c;只需要几步简单的点击即可 *主要的步骤&#xff1a; 1.准备数据 2.训练模型 3.部署 4.H5 * 1.首先创建两个文件夹cat和dog分别搜集至少20张以上的猫和狗的图片&#xff08;如果不足20张&…

【High 翻天】Higer-order Networks with Battiston Federico (1)

目录前言高阶网络的表示高阶相互作用的初等表示表示之间的关系总结前言 Ginestra Bianconi 的一篇综述1和一本书2展开的故事。 书还没有开始看&#xff0c;先看看综述吧。综述提供了一个关于超越成对交互的网络新兴领域的概述。 讨论了高阶网络的表示&#xff0c;主要是其中…

HBase Shell 基本操作

首先确保你的hbase集群已经开启 进入 HBase 客户端命令行 namespace 使用help查看命令用法&#xff0c;并创建命名空间 查看所有命名空间 DDL 在 bigdata 命名空间中创建表格 student&#xff0c;两个列族。info 列族数据维护的版本数为 5 个&#xff0c; 如果 VERSIONS …

Arduino UNO通过SPI串行方式驱动LCD12864液晶屏

LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器&#xff0c;可配合各种单片机可完成中文汉字、英文字符和图形显示&#xff0c;可构成全中文人机交互图形界面&#xff0c;模块具有功耗低、显示内容丰富等特点而应用广泛。它是利用液晶经过处理后能改变光线的传播…

前端面试八股文(详细版)—上

本文将详细讲解 HTML 、CSS 、JavaScript 、计算机网络知识等方面的内容&#xff0c;Vue 、React 、git 、项目开发实例等内容放在下篇&#xff0c;预祝各位成功上岸&#xff01; 第一板块&#xff1a;JavaScript ES6 新增内容 1、模板字符串 变量名写在 ${} 中&#xff0c;$…

可用性测试的理解

可用性测试是通过观察有代表性的用户&#xff0c;完成产品的典型任务&#xff0c;从而界定出可用性问题并解决的过程。通俗地讲就是“观察用户使用产品”。 可用性测试到底测的什么? a 有效性(独立完成任务的比例) b 完成任务的时间 c 满意度(用户主观评价操作难易/好感/是否再…

回归预测 | MATLAB实现贝叶斯优化门控循环单元(BO-GRU)多输入单输出

回归预测 | MATLAB实现贝叶斯优化门控循环单元(BO-GRU)多输入单输出 目录回归预测 | MATLAB实现贝叶斯优化门控循环单元(BO-GRU)多输入单输出基本介绍背景回顾模型介绍程序设计学习总结参考资料致谢基本介绍 本次运行测试环境MATLAB2020b&#xff1b; 本次预测基本任务是回归&a…

【JavaEE】JavaScript(基础语法)2

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言四、【运算符】五、条件、三元、switch、循环语句六、数组七、函数八、 对象THINK前言 一个人最大的痛苦来自于对自己无能的愤怒&#xff01; Hi&#xff0c;这里依旧是秃头宝贝儿&#xff01; 本文依旧是介绍…

win10录屏功能怎么打开,详细图文教学,轻松学会

在生活中&#xff0c;有不少人的电脑&#xff0c;都是WIN10系统&#xff0c;在学习工作或者娱乐的过程中想要录下视频&#xff0c;就需要使用win10录屏功能。Win10录屏功能怎么打开&#xff1f;Windows自带的屏幕录制功能如何使用&#xff1f;不要着急&#xff0c;今天小编将向…

尚医通-微信支付

流程梳理 依赖和工具类 <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version> </dependency><dependency><groupId>com.example</groupId><ar…

Collagen胶原蛋白修饰亚油酸linoleic acid/甲磺酸酯Mesylate/磷酸三苯酯TPP

产品名称&#xff1a;胶原蛋白修饰亚油酸 英文名称&#xff1a;Collagen-linoleic acid 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 胶原蛋白是一种细胞外蛋…

Mybatis:Mybatis中特殊Sql执行(6)

特殊Sql执行1. 模糊查询2. 批量删除3. 动态设置表名4. 添加功能获取自增的主键5. 整体代码1. 模糊查询 /*** 根据用户名进行模糊查询* param moHu* return*/List<User> getUserByLike(Param("moHu") String moHu);<!--List<User> getUserByLike(Param…

Java多线程之相关拓展(静态代理和Lamda表达式演变)

Java多线程拓展之静态代理和Lamda表达式演变一、静态代理1、概念2、优点3、样例二、Lamda表达式&#xff08;演变过程展示&#xff09;1、定义一个函数式接口并实现类&#xff08;最初状态&#xff09;2、静态内部类&#xff08;状态演变2&#xff09;3、局部内部类&#xff08…

英国G5生物医学类专业IB成绩要求多高?

生物医学类专业一向是申请热门。最近几年&#xff0c;由于新冠疫情的原因&#xff0c;相关专业申请竞争更加激烈了。英国G5生物医学类专业IB成绩要求多高&#xff1f;话说&#xff0c;IB申请英国的生物医学类专业&#xff0c;需要做好哪些准备&#xff1f;英国大学的生物医学类…

Spring Data JPA使用Pageable 参数Thymeleaf 视图进行分页

在上一个教程中&#xff0c;我们看到了如何在Spring MVC控制器方法中使用参数。以下示例显示了如何将 Spring 数据分页与 Thymeleaf 视图一起使用。我们还将使用注释来更改默认页面大小。PageablePageableDefault 例 实体 package com.example;import jakarta.persistence.E…

VS系列多通道振弦温度采发仪的选型与开机操作

VS A B C D E VS&#xff1a;无线型振弦传感器采发仪 A&#xff1a;内嵌核心测量模块数量&#xff08;1~4 个&#xff09; B&#xff1a;两位数字表示的振弦通道数量&#xff08;02、04、08、16&#xff09; C&#xff1a;T 表示带有温度测量通道 D&#xff1a;是否有…

【能效管理】电力监控系统在移动某分公司配电系统中的应用分析

安科瑞 李亚俊 壹捌柒贰壹零玖捌柒伍柒 概述 在社会科技发展越来越快捷和便利的现在&#xff0c;对用电设施的管理和实时监视越来越重要。在用电过程中经常发生漏电、过流等现象。甚至照成断电现象&#xff0c;而及时查询故障并解决问题恢复用电也越发重要。 中国移动通信集…

LeetCode 278. 第一个错误的版本

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓本LeetCode 278. 第一个错误的版本&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetC…

Python基础(十):列表的详细讲解

文章目录 列表的详细讲解 一、列表的应用场景 二、列表的格式 三、列表的常用操作 1、查找 2、增加 3、删除 4、修改 5、复制 四、列表的循环遍历 1、while 2、for 五、列表嵌套 六、总结 列表的详细讲解 一、列表的应用场景 思考&#xff1a;有⼀个⼈的姓名(TO…

菜狗杯Misc迅疾响应wp

一、原题 之前没接触过这种题型&#xff0c;所以记录一下 打开题目附件压缩包是一个图片&#xff0c;一看就不是常见的那种二维码&#xff08;甚至看起来有点不适……呜呜&#xff09;果然微信扫一扫也扫不出来。 二、工具和解题步骤 后来去看了官方wp&#xff0c;知道了一…