广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java设计模式之迭代器模式
  • 163
分享到

Java设计模式之迭代器模式

2024-04-02 19:04:59 163人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文介绍设计模式中的迭代器模式,首先通俗的解释迭代器模式的基本概念和对应的四个角色,并根据四个角色举一个典型的实例,为了加强知识的连贯性,我们以jdk源码集合中使用迭代器模式的应用进

本文介绍设计模式中的迭代器模式,首先通俗的解释迭代器模式的基本概念和对应的四个角色,并根据四个角色举一个典型的实例,为了加强知识的连贯性,我们以jdk源码集合中使用迭代器模式的应用进一步说明,最后说明迭代器模式的应用场景和优缺点。

读者可以拉取完整代码本地学习,实现代码均测试通过上传到码云,本地源码下载。

一、概念理解

迭代器模式官方解释就是提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。何为聚合对象呢?最典型的就是集合类。

大白话也就是,集合中的数据是私有的,集合中不应该提供直接遍历的方法,要定义一个新的对象用于访问这个集合。

既然是一个专门用来遍历的对象,一个被遍历的聚合对象,很显然至少有两个对象,迭代器对象、聚合对象,由于遵循面向接口编程的原则,迭代器对象和聚合对象应该抽象出来接口,那自然而然就是应该有四个角色:

抽象聚合(InterfaceAggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。

具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。

抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。

具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

基于四个角色我们举一个典型案例。

二、案例实现

应该是有四个类

抽象聚合角色,用于定义增删改查元素的统一规范接口,和创建迭代器对象的方法

具体聚合角色,实现抽象聚合角色方法

抽象迭代器角色,定义遍历元素的统一规范接口

具体迭代器,实现抽象迭代器角色的方法。

抽象聚合角色:


public interface InterfaceAggregate {
    
    void add(Object obj);

    
    void remove(Object obj);

    
    Iterator getIterator();
}

具体聚合角色:


public class ConcreteAggregate implements InterfaceAggregate{
    private List<Object> list = new ArrayList<>();
    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }

    @Override
    public Iterator getIterator() {
        return new Concretelterator(list);
    }
}

抽象迭代器角色:


public interface Iterator<E> {

    
    Object remove();

    
    E next();

    
    boolean hasNext();

    
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

}

具体迭代器角色:


public class Concretelterator implements Iterator{
    private List<Object> list = null;
    private int index = -1;

    public Concretelterator(List<Object> list) {
        this.list = list;
    }

    @Override
    public Object remove() {
        index = list.size();
        Object obj = list.get(index);
        list.remove(obj);
        return obj;
    }

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

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

客户端调用:


public class Client {

    public static void main(String[] args) {
        ConcreteAggregate concreteAggregate=new ConcreteAggregate();
        concreteAggregate.add("老王");
        concreteAggregate.add("小王");
        concreteAggregate.add("小张");

        System.out.println("Aggregate聚合对象有:");

        Iterator iterator=concreteAggregate.getIterator();

        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next.toString());
        }
        //遍历剩下的角色
        iterator.forEachRemaining(ele -> System.out.println(ele));

    }

}

迭代器实现逻辑比较清晰,理解起来难度也不大,了解了该设计模式,趁热打铁看迭代器模式在源码中的应用。

三、源码应用

迭代器模式在Jdk中的集合类中有着广泛的应用,我们以ArrayList作为典型。

在ArrayList实现迭代器时,同样是有四个角色。

List抽象聚合类;

ArrayList具体聚合角色;

Iterator抽象迭代器;

ArrayList内部类Itr是具体迭代器;

我们可以看到ArrayList是把具体聚合角色和具体迭代器都写在一个类中,Itr作为具体迭代对象是以内部类的形式。

ArrayList其实和我们案例中的方法长的很像,只不过ArrayList中定义了更多的方法,而且ArrayList还有一个内部类ListItr。

其实是迭代器的增强版,在继承Itr的基础之上实现ListIterator接口。

Iterator迭代器除了,hasNext()、next()、remove()方法以外,还有一个特别的forEachRemaining()方法,我们重点说下forEachRemaining()方法,该方法代表的意思是遍历剩下的集合。

比如我们已经调用了该集合中的第一个元素,那么遍历时候就会自动忽略第一个元素,遍历剩下的元素。

我们写一个测试方法看效果:

public class Client {

    public static void main(String[] args) {
      
        // jdk ArrayList迭代器
        //创建一个元素类型为Integer的集合
        Collection<String> collection =  new ArrayList<>();

            //向集合中添加元素
            collection.add("老王");
            collection.add("小王");
            collection.add("小张");

        //获取该集合的迭代器
        java.util.Iterator<String> iteratorJdk= collection.iterator();
        System.out.println("Arraylist聚合对象有:");
        //调用迭代器的经过集合实现的抽象方法遍历集合元素
        while(iteratorJdk.hasNext())
        {
            System.out.println(iteratorJdk.next());
        }
        //调用forEachRemaining()方法遍历集合元素
        iteratorJdk.forEachRemaining(ele -> System.out.println(ele));

    }

}

Arraylist聚合对象有:
老王
小王
小张

正常情况下,会打印两次集合对象中的信息,实际上只打印了一次,正是由于next调用过的元素,forEachRemaining不会再调。

看到这,想必你对迭代器已经有了初步的了解,当在遍历元素时,除了使用for循环遍历元素以外,提供了另外一种方式遍历元素。

案例很好理解,源码中的应用也看得懂,但是实际开发中迭代器对象什么时候用呢?想必大部分人并不是很清晰。

接着看迭代器对象的应用场景和优缺点,看从中能不能找到答案。

四、总结

当一个对象是一个聚合对象且需要对外提供遍历方法时,可以使用迭代器模式,也即实际业务中定义的有聚合对象,里面存放了我们需要的业务数据,为了让业务数据的职责更清晰,我们就可以将编辑的方法提取出来,另外定义一个迭代器对象用于遍历数据。

迭代器方式提供了不同的方式遍历聚合对象,增加新的聚合类和迭代器类都是比较方便的,Java集合类中庞大的家族采用迭代器模式就是基于这种优点。

迭代器模式有设计模式的通用缺点——系统复杂性,迭代器模式将数据存储和数据遍历分开,增加了类的个数。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

--结束END--

本文标题: Java设计模式之迭代器模式

本文链接: https://www.lsjlt.com/news/169043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java设计模式之迭代器模式
    本文介绍设计模式中的迭代器模式,首先通俗的解释迭代器模式的基本概念和对应的四个角色,并根据四个角色举一个典型的实例,为了加强知识的连贯性,我们以Jdk源码集合中使用迭代器模式的应用进...
    99+
    2022-11-13
  • Java设计模式之java迭代器模式详解
    目录前言介绍角色迭代器模式中的工厂模式学院遍历的案例分析解决方案基本介绍原理类图上面案例的类图案例实现代码案例总结应用实例Java集合中的迭代器模式角色说明Mybatis中的迭代器模...
    99+
    2022-11-12
  • javascript设计模式之迭代器模式
    目录迭代器模式介绍示例迭代器模式UML类图迭代器模式原生代码演示迭代器模式的场景ES6 Iterator示例总结迭代器模式介绍 顺序访问一个集合 顺序:如数组、类数组称为顺序,而非对...
    99+
    2022-11-12
  • 深入理解Java设计模式之迭代器模式
    目录一、什么是迭代器模式二、迭代器模式的结构三、迭代器模式的使用场景四、迭代器模式的优缺点优点:缺点:五、迭代器模式的实现抽象聚合类迭代器抽象类具体聚合类具体迭代器类客户端调用六、N...
    99+
    2022-11-12
  • C#设计模式实现之迭代器模式
    目录前言:一、餐馆合并菜单 二、改进菜单实现 三、迭代器模式 总结前言: 迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么...
    99+
    2022-11-12
  • PHP设计模式之迭代器模式浅析
    目录迭代器模式PHP中的迭代器模式迭代器模式 迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和遍历分...
    99+
    2023-05-14
    PHP迭代器模式 PHP 设计模式 迭代器模式
  • PHP设计模式之迭代器模式的使用
    目录Gof类图及解释实例一说到这个模式,就不得不提循环语句。在《大话设计模式》中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得。任何...
    99+
    2022-11-12
  • JavaScript设计模式之迭代者模式详情
    目录前言迭代器设计模式在生活中的运用迭代器设计模式在业务上的应用内部迭代器外部迭代器前言 迭代器设计模式是指提供一个方法去访问一个有序复杂数据,这些数据在内部有可能会用复杂的结构进行...
    99+
    2022-11-13
  • Java设计模式中的迭代器模式详解
    目录一 定义二 UML类图三 代码实例四 迭代器模式的优缺点4.1 优点4.2 缺点五 使用场景六 JDK迭代器的运用一 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露...
    99+
    2023-02-08
    Java迭代器模式 Java设计模式
  • .Net行为型设计模式之迭代器模式(Iterator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、迭代器模式的代码实现六、迭代器模式的实现要点:迭代器模式的优点:迭代器模式的缺点:迭代器模式的使用...
    99+
    2022-11-13
  • PHP设计模式之迭代器模式怎么实现
    本篇内容主要讲解“PHP设计模式之迭代器模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP设计模式之迭代器模式怎么实现”吧!迭代器模式迭代器模式(Iterator Pattern)...
    99+
    2023-07-05
  • Java设计模式之代理模式
    本文由老王出租房子引出——代理设计模式,将从最简单的静态代理实现开始,后延伸使用jdk实现动态代理,最后扩展到Cglib实现动态代理。为了更深入理解代理模式,...
    99+
    2022-11-13
  • Java设计模式之迭代器模式_动力节点Java学院整理
    定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:       如果要问Java中使用最多的一种模式,答案不是单例模式,也不是工厂模式...
    99+
    2023-05-31
    java 设计模式 迭代器模式
  • javascript设计模式之迭代器模式的示例分析
    这篇文章主要介绍了javascript设计模式之迭代器模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。迭代器模式分为内部迭代器和...
    99+
    2022-10-19
  • 每天一个设计模式·迭代器模式
    迭代器模式·原文地址 更多《设计模式系列教程》 更多免费教程 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,...
    99+
    2023-01-31
    模式 迭代
  • Java设计模式之代理模式详解
    目录一、代理模式二、静态代理三、动态代理一、代理模式 代理模式就是有一个张三,别人都没有办法找到他,只有他的秘书可以找到他。那其他人想和张三交互,只能通过他的秘书来进行转达交互。这个...
    99+
    2022-11-12
  • java设计模式笔记之代理模式
    代理(Proxy)模式:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。核心作用:通过代理,控制对对象的访问。可以详细控制访问某个(某类)对象的方法,在调用这个方法之前做前置处理,在调用这个方...
    99+
    2023-05-31
    java 设计模式 代理模式
  • java设计模式学习之代理模式
    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式结构图模拟需求:3班小张喜欢1班小红,但是不认识小红,委托1班小明送给小红礼物。创建一个小张和小明都能实现的接口。package ProxyModel;inter...
    99+
    2023-05-31
    java 设计模式 代理模式
  • 如何深入理解Java设计模式的迭代器模式
    如何深入理解Java设计模式的迭代器模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是迭代器模式迭代器模式是针对集合对象而生的,对于集合对象而言,肯定...
    99+
    2023-06-25
  • Java设计模式之适配器模式
    本文通过老王使用纸质书籍阅读小王使用电子书籍的故事,详细说明设计模式中的结构型设计模式之适配器模式,分别对对象适配器和类适配器代码实现,最后为了加深理解,会列举适配器设计模式在JDK...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作